玩转java反射 玩玩JAVA反射

什么是反射

  • Java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任何一个方法和属性;这样动态获取新的以及动态调用对象的方法的功能就叫做反射。
  • 简单来说反射就是解剖一个类,然后获取这个类中的属性和方法,前提是要获取这个类的Class对象。
  • 在java中,给我们提供几个类用于描述编译后的对象  

描述

java.lang.Class

描述编译后的class文件的对象

java.lang.reflect.Constructor

用于描述构造方法

java.lang.reflect.Field

描述字段(成员变量)

java.lang.reflect.Method

描述成员方法

如何使用反射

1、使用Class类,获取出被解剖的这个类的class文件对象

2、使用Class类方法,获取出类中的所有成员

3、将成员获取出来后,交给对应类,对应类中的方法,运行成员

如何获取class文件对象

  • 使用类的对象获取

调用Object类的getClass() 方法,obj.getClass()

  • 使用类的静态属性获取

ClassName.class

  • 使用Class类的静态方法获取

 

不管用哪种方式获取的Class对象,他们都是相等的。

获取类对象

  • 获取Field
Class cls = xxx.class;
Field[] fields1 = cls.getFields();//获取Class对象里面所有public的成员变量
Field[] fields2 = cls.getDeclaredFields();//获取Class对象中所有的成员变量
Field field1 = cls.getField("a");//获取Class对象中名字为 a 的成员变量
Field field2 = cls.getDeclaredField("b");//获取Class对象中名字为 b 的成员变量
  • 获取Method
Class cls = xxx.class;
Method[] methods = cls.getMethods(); //获取Class对象里面所有public的方法
Method[] declaredMethods = cls.getDeclaredMethods(); //获取Class对象里面所有public的方法
Method[] method1 = cls.getMethod("method"); //获取Class对象里面所有public的方法
Method declaredMethod1 = cls.getDeclaredMethod(""); //获取Class对象里面所有public的方法
  • 获取构造函数
Constructor[] constructors = cls.getConstructors(); //获取所有public构造函数
Constructor[] declaredConstructors = cls.getDeclaredConstructors(); //获取所有构造函数,包括private构造函数
Constructor constructor = cls.getConstructor(String.class); //获取指定参数public构造函数
Constructor declaredConstructor = cls.getDeclaredConstructor(Integer.class); //获取指定参数的构造函数,也可以private

修改Field

对于private的属性,必须设置 accessible 为 true 的时候才可以设置,否则会抛出 java.lang.IllegalAccessException 异常。

Field field = xxx;
//private field 需要设置 accessible
//field.setAccessible(true);
//obj是对象,value是要设置的值
field.set(obj,value);

调用方法

对于private的方法,必须设置 accessible 为 true 的时候才可以设置,否则会抛出 java.lang.IllegalAccessException 异常。

Method method = xxx;
//private 方法需要设置 accessible
//method.setAccessible(true);
//obj为对象,param1,param2 为参数,当方法无参时,直接调用 method.invoke(obj); 即可
method.invoke(obj,param1,param2...)