美文网首页
Java-反射机制

Java-反射机制

作者: ZOKE | 来源:发表于2017-07-02 21:40 被阅读13次

简介:通过获取Java编译后产生的字节码(class格式)文件,使用Java的反射机制从而获取得到该类的所有属性、方法,以达到设置该类的属性以及调用该类的方法的目的。

1.获取字节码文件的3种方式
(1)通过全类名获取字节码对象(在eclipse代码编写区内找到类名,鼠标左键点击该类名,然后右键选择"Copy Qualified Name")
Class clazz1 = Class.forName("cn.zzo.reflect17.Cat");
(2)通过类.class直接得到
Class clazz2 = Cat.class;
(3)通过该类的对象.getClass()方法获得
Class clazz3 = new Cat().getClass();
2.获取属性的方式
(1)获取该类以及其父类的所有公共(public)属性对象
Field[] fields = catClass.getFields();
(2)获得该类的所有属性(包括公有和私有)对象,但是不包括父类的任何属性对象
Field[] declaredFields = catClass.getDeclaredFields();
(3)获取该类或者父类中名字为sex的一个公共(public)属性对象,如果两个类都有则优先获取本类的sex
Field field = catClass.getField("sex");
(4)获取该类中名字为name的一个属性对象,无论公有还是私有都可以获取到
Field declaredfield = catClass.getDeclaredField("name");
(5)要设置类中的私有变量的值,必须先设置其权限,该方式称为暴力反射
Field nameField = catClass.getDeclaredField("name");
nameField.setAccessible(true);  //暴力反射
nameField.set(cat, "kitty");    //设置一个属性的值
Object object = nameField.get(cat);     //获取cat对象当中名字叫做name的属性的值
3.获取方法的方式
(1)获取该类以及其父类的所有公共(public)方法对象
Method[] methods = catClass.getMethods();
(2)获得该类的所有方法(包括公有和私有)对象,但是不包括父类的任何方法对象
Method[] declaredMethods = catClass.getDeclaredMethods();
(3)获取该类或者父类中名字为methodName的一个公共(public)属性对象,如果两个类都有则优先获取本类的methodName
Method method = catClass.getMethod("methodName");
(4)获取该类中名字为methodName的一个属性对象,无论公有还是私有都可以获取到
Method declaredMethod = catClass.getDeclaredMethod("methodName");
(5)有参和无参方法的获取
Method eatMethod = catClass.getMethod("eat", String.class);     //获取该类中一个名字为eat参数为String类型的方法
Method sleepMethod = catClass.getMethod("sleep");   //获取该类中一个名字为sleep无参的方法
(6)方法的调用
eatMethod.invoke(cat, "芝麻");    //调用cat对象的eat方法,并将String类型的参数"芝麻"传入进去
sleepMethod.invoke(cat);        //调用cat对象的sleep方法,不传任何参数
(7)获取与使用构造方法
Constructor[] constructors = catClass.getConstructors();    //获取所有的构造方法
Constructor constructor = catClass.getConstructor(String.class,String.class);   //获取有参构造方法
Object newInstance1 = constructor.newInstance();    //使用无参构造方法实例化一个对象
Object newInstance2 = constructor.newInstance("kittttty","female");     //使用有参构造方法实例化一个对象
Object cat2 = catClass.getConstructor(String.class,String.class).newInstance("kitttty","female");   //也可以像这样一步完成
4.获取变量的修饰符
int modifiers = field.getModifiers();
1表示public,2表示private,4表示protected,8表示static,10表示final

相关文章

  • Java-反射机制

    简介:通过获取Java编译后产生的字节码(class格式)文件,使用Java的反射机制从而获取得到该类的所有属性、...

  • JAVA-反射机制

    Class类类是对象,类是java.lang.Class类的实例对象。任何一个类都有一个隐含的静态成员变量。Cla...

  • Java-反射机制

    思考:在Java运行环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个...

  • JAVA-反射机制和动态编译

    下面通过一段代码来引入反射机制的作用。 以上代码看似很好的解决需要执行不同方法的问题,需要哪个方法只要修改new类...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java-反射

    Class类的使用 Class类比较特殊,也比较难理解一些,所有类都是它的实例对象。我们用代码来理解一下: 普通的...

  • Java-反射

    参考:https://mp.weixin.qq.com/s/UYqPCmo2vpAibJPh6cupLw 1.定义...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

网友评论

      本文标题:Java-反射机制

      本文链接:https://www.haomeiwen.com/subject/xkyocxtx.html