一、 获取字节码 c (三种方法)
- . Class
- .getClass()
- .Class.forName("完整的全路径")
二、 获取构造方法
1.c 通过下列方法得到构造方法的对象 con (四种方法)
- getConstructor(参数个数,参数类型),获取指定的公共构造方法
- getConstructors(),获取公共构造方法
- getDeclaredConstructor(参数个数,参数类型),获取指定的构造方法
- getDeclaredConstructors(),获取全部构造方法
2. con 通过.newInstance()创建一个实例对象 obj
如果是通过.getDeclaredConstructor()获得的对象,是无法用私有的构造方法实例化的,所以要先.setAccessible(true),取消访问检查即可
三、 获取成员变量
1. c 通过下列方法实例化一个成员变量 addressField
- getField(String name 成员变量的名字),获取指定的公共成员变量对象
- getDeclaredField(String name 成员变量的名字),获取指定的成员变量对象
可以通过.getFields()或getDeclaredFields()返回包含所有成员变量的数组的对象fields(这个数组包含有所有成员变量)
2. 给 obj 的成员变量 addressField 赋值 “西安“
addressField . set(obj,”西安”)
//如果addressField是私有的,要用addressField.setAccessible(true) 取消访问检查
四、 获取成员方法
1. c 通过下列方法可以获得成员方法
- .getMethod(String name 方法名字 , args 参数),获取公共的方法
- .getDeclaredMethod(String name 方法名字 , args 参数),获取方法
- .getMethods(),返回一个数组,该数组包括所有方法以及继承的和超类中的方法
- .getDeclaredMethods(),返回一个只包含本类的所有方法的数组
例:Method m = c.getMethod(“method1”)
2. 调用成员方法
//调用obj对象的m成员方法(method1方法)
m . invoke(obj 实例化的对象, args 参数)
//没有参数就不用写参数,如果method1是私有的,就要m.setAccessible(true)取消访问检查
五、 反射可以越过泛型检查
例如,通过反射可以往ArrayList