源码地址: [](https://files.cnblogs.com/files/paidaxing7090/reflect.zip)
reflect 反射
1. reflect 反射,理解成“透视”会更准确一点
文本配置文件 config.txt
day1901.A;a
day1901.B;b
day1901.C;c
day1901.D;d
使用‘类对象’来执行反射
反射获得一个类的定义信息
反射创建对象
反射调用成员变量、方法
2.获得类对象的三种方式
A.class
Class.forname("day1901.A")
a.getClass();
如果类未加载,要先加载才能获取。
3.类对象获得包名、类名 Class<?> c= Class.forName(s);
c.getPackage().getName(); //包名
c.getName(); //类名
c.getSimpleName();//简写类名
4.获得成员变量的定义信息
getFields() //获得多个成员变量
getDeclaredfields() //本来定义的所有变量 包括私有,不含有继承
getField(变量名)
getDeclaredfield(变量名)
5.获得构造方法信息
getConstructors() //获得可见构造方法
getDeclaredConstructors() 获得所有构造方法
getConstructor(参数列表)
getDeclaredConstructor(int.class , String.class) 获得参数列表为相应对象的 方法
6.获得方法的定义信息
getMethods() 可见的方法,包含继承
getDeclaredMethods() // 本类定义的方法,包含私有,不包含继承
getMethod(方法名,int.class,String.class) //指定方法名+参数列表类型
getDeclaredMethod(方法名,int.class,String.class )
7.反射创建对象
通过“类对象”的反射操作,(类对象在方法区加载)
执行无参构造
Object obj = c.newInstance(); //新建c类型的对象
执行有参构造
Constructor t = c.getConstructor(参数类型列表 int.class,String.class ) //获得构造方法
Object obj = t.newInstance(666,"AAA") ;//通过构造方法的反射操作,来新建对象
8.反射调用成员变量
获得成员变量
field f = c.getDeclaredfield("age"); //封装了成员信息 和 反射操作
f.set(对象,21); 给指定对象 的age变量 赋值。静态变量 对象 给null
int i= (int) f.get(对象 ); // 获取指定对象的age 的object对象, 需要强制类型转换
f.setAccssible(true) ;//可使私有变量也可以被访问。
9.反射调用成员方法
Method t=c.getMethod(方法名,int.class,String.class) 获得方法(定义信息+反射操作)
t.setAccssible(true) ; //使私有方法可被调用
t.invoke(对象,int.class 1 ,String.class "aaa") //调用方法,需要指定对象 ,添加参数列表
t.invoke(null ) 静态方法。 有返回值得到返回值,没有得到null
10.反射是框架的底层实现原理