什么是反射
- 反射允许对成员变量、成员方法、构造方法的信息进行编程访问
- 说白了就是获取类中的成员变量、成员方法、构造方法的信息
- 可以获取到
- 字段(成员变量)
- 成员方法
- 构造方法
- 可以解剖出
- 修饰符
- 名字
- 类型
- 值/赋值
- 形参
- 创建对象
- 返回值
- 抛出的异常
- 注解
- 运行获取到的方法
在反射面前,类的一切都是赤裸裸的展现在我们的眼前
获取
获取是从class字节码文件中获取的,所以要先学习获取字节码文件Class
获取Class对象
有三种方式对应三种阶段
-
Class.forName(“全类名”)
- 对应源代码阶段
- 最为常用的一种方法
-
类名.class()
- 对应加载阶段(内存)
- 一般更多地作为参数传递
-
对象.getClass()
- 对应运行阶段
- 当已经有这个类的对象时,才可以使用
获取Class对象中的构造方法
构造方法有一个类来描述:Constructor
Constructor getConstructor(参数是类型的class,与目标构造函数保持一致)
Constructor getDeclaredConstructor(参数是类型的class,与目标构造函数保持一致)
Constructor[] getConstructors
Constructor[] getDeclaredConstructors
获取Class对象中的成员变量
成员变量有一个类来描述:Field
Field getField()
Field getDeclaredField()
Field[] getFields()
Field[] getDeclaredFields()
获取Class对象中的成员方法
成员方法有一个类来描述:Method
Method getMethod(“方法名”,参数类型.class…) - 获取单个公共方法
Method getDeclaredMethod(“方法名”,参数类型.class…) - 获取当个私有方法
Method[] getMethods() - 获取所有公共方法,包括从父类中继承下来的
Method[] getDeclaredMethods() - 获取所有当前子类的方法,不包括从父类中继承的,但可以获取私有方法
解剖
解剖构造方法
int getModifiers() - 获取构造方法修饰符
Parameter[] getParameters() - 获取构造方法参数列表
Object newInstance(初始化列表) - 使用该构造方法创建对象
解剖成员变量
int getModifiers() - 获取修饰符
String getName() - 获取变量名
Class getType() - 获取类型
Object get(对象名) - 获取变量记录的值
void set(对象名,新值) - 修改对象中目标成员变量的值
解剖成员方法
int getModifiers() - 获取方法权限修饰符
String getName() - 获取方法名
Class[] getParameterTypes() - 获取方法参数列表
Class getReturnType() - 获取方法返回值
Class[] getExceptionTypes() - 获取方法抛出的异常
Object invoke(对象名,方法实际参数…) - 运行方法
暴力反射
暴力体现在对类中私有化的属性进行临时访问
构造方法/成员变量/成员方法.setAccessible(true/false) 可以临时改变访问权限
比如我们原来私有的构造方法,临时改变访问权限为true后就可以使用私有化的构造方法进行实例化对象,成员变量和成员方法也一样