一、反射概念
a、反射是指对于任何一个Class类,在运行的时候都可以直接得到这个类的全部成分;
b、在运行时,可以直接得到这个类的构造器对象:Constructor
c、在运行时,可以直接得到这个类的成员变量对象:Field
d、在运行时,可以直接得到这个类的成员方法对象:Method
e、这种运行是动态获取类信息以及动态调用类中成分的能力称为Java原因的反射机制。
反射基本作用:
反射是在运行时获取类的字节码文件对象:然后可以解析类中的全部成分。
反射的关键:
反射的第一步都是先得到编译后的Class类对象,然后就可以得到Class的全部成分。
二、反射获取类对象、构造器对象、成员变量对象、方法对象
1.反射获取类对象
a、反射的第一步是什么?
获取Class类对象,才可以解析类的全部成分。
b、获取Class类的对象的三种方式
方式一:class c1 = class.forName("全类名") ;
方式二:class c2 = 类名.class;
方式三:class c3 = 对象.getclass();
2.反射获取构造器对象
使用反射技术获取构造器对象并使用:
第一步:获取class对象 第二步:获取Constructor对象 第三步:创建对象
class类中用于获取构造器的方法
方法 | 说明 |
Constructor<?> getConstructors() | 返回所有构造器对象的数组(只能拿public的) |
Constructor<?> getDeclaredConstructors() | 返回所有构造器对象的数组,存在就能拿到 |
Constructor<T> getConstructors(class<?>... parameterTypes) | 返回单个构造器对象(只能拿public的) |
Constructor<T> getDeclaredConstructors(class<?>... parameterTypes) | 返回单个构造器对象,存在就能拿到 |
获取构造器的作用依然是初始化一个对象返回
Constructor类中用于创建对象的方法
符号 | 说明 |
T newlnstance(Object... initargs) | 根据指定的构造器创建对象 |
public void setAccessible(boolean flag) | 设置为ture,表示取消访问检查,进行暴力反射 |
反射得到的构造器可以做什么?
依然是创建对象的 public newlnstance(Object... initargs)
若是非public的构造器,需要打开权限(暴力反射),然后在创建对象
setAccessible(boolean)
反射可以破坏封装性,私有的也可以执行了
3.反射获取成员变量对象
使用反射技术获取成员变量对象并使用:
第一步:获取class对象 第二步:获取Field对象 第三步:赋值或者获取
Class类中用于获取成员变量的方法
方法 | 说明 |
Field[ ] getFields() | 返回所有成员变量对象的数组(只能拿public的) |
Field[ ] getDeclaredFields() | 返回所有成员变量对象的数组,存在 就能拿到 |
Field getField(String name) | 返回单个成员变量对象(只能拿public的) |
Field getDeclaredField(String name) | 返回单个成员变量对象,存在就能拿到 |
获取成员变量的作用实在某个对象中取值、赋值
Field类中用于取值、赋值的方法
符号 | 说明 |
void set(Object obj,Object value): | 赋值 |
Object get(Object obj) | 获取值 |
反射得到成员变量可以做什么?
依然在某个对象中取值盒赋值
void set(Object obj,Object value):
Object get(Object obj)
若某个成员变量是非public的,需要打开权限(暴力反射),然后取值,赋值。
setAccessible(boolean)
4.反射获取方法对象
使用反射技术获取方法对象并使用:
第一步:获取class对象 第二步:获取Method对象 第三步:运行方法
Class类中用于获取成员方法的方法
方法 | 说明 |
Method [ ] getMethods( ) | 返回所有成员方法对象的数组(只能拿public的) |
Method [ ] getDeclareMethods( ) | 返回所有成员方法对象的数组,存在 就能拿到 |
Method getMethod(String name,class<?>... parameterTypes) | 返回单个成员方法对象(只能拿public的) |
Method getDeclareMethod(String name,class<?>... parameterTypes) | 返回单个成员方法对象,存在就能拿到 |
获取成员方法的作用是在某个对象中进行执行此方法
Method类中用于触发执行的方法
符号 | 说明 |
object invoke (object obj,object...args) | 运行方法 参数一:用obj对象调用该方法 参数二:调用方法的传递的参数(如果没有就不写) 返回值:方法返回值(如果没有就不写) |
反射得到成员方法可以做什么?
依然是在某个对象中触发该方法执行 object invoke (object obj,object...args)
如果某成员方法是非public的,需要打开权限(暴力反射),然后再触发执行。
setAccessible(boolean)