源码地址:  [](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.反射是框架的底层实现原理