反射 Reflect
1. 解释:
(1) 给一个类,照透视,可以获得一个类的定义信息:
包名、类名
成员变量的定义信息
getFields(); 获得所有可见(私有的不能获得)的成员变量,包括继承的变量
getDeclaredFields() 本类定义的所有成员变量,包括私有变量,不包括继承变量
getField(变量名) 获得一个变量
getDeclaredField(变量名) 获得一个变量
构造方法的定义信息
getConstructors(); 所有可见的构造方法
getDeclaredConstructors() 所有的构造方法,包括私有的
getConstructor(参数类型列表) 获得一个构造方法
getDeclaredConstructor(参数类型列表) 获得一个构造方法
方法的定义信息
getMethods() 获得可见的方法。包括继承的方法
getDeclaredMethods() 获得本类定义的所有的方法,包括私有的,不包括继承的
getMethod(方法名,参数列表) 获得一个方法
getDeclaredMethod(方法名,参数列表) 获得一个方法
练习参考下篇随笔:https://www.cnblogs.com/gxlaqj/p/11429177.html
(2)反射新建实例(创建对象)
执行无参构造 //c 为类对象 Object obj = c.new Instance(); 执行有参构造 //获得构造方法 Constructor cc = c.getConstructor(int.class,String.class); //新建实例,并执行这个有参构造 Object obj = cc.newInstance(5,"abc"); 练习参考下篇随笔:https://www.cnblogs.com/gxlaqj/p/11429177.html
(3).反射调用成员变量
获取成员变量 Field f = c.getDeclaredField(变量名); 使私有变量也能访问 f.setAccessible(true); 给变量赋值 f.set(实例,值); 若是静态方法。第一个参数给null 取值 f.get(实例); j静态方法,第一个参数给null;
(4).反射调用成员方法
获取方法
Method m = c.getMethod(方法名,参数类型列表);
使私有方法可以被调用
m.setAccessible(true);
调用方法:
m.invoke(实例,具体参数数据);
如果静态方法,第一个参数给null
如果是void方法,返回值是null
2. 反射需要使用 类对象
类对象:一个类被加载到方法去,会创建一个“类对象”,类型是Class类型
获取类对象:
(1)类名.class
String.calss
Integer.class
Soldier.class
(2)Class.forName(“完整类名”)
(3)对象.getClass();
3. 获得包名类名
//c 为类对象
c.getPackget().getName(); 获得字符串包名
c.getName() 完整类名(包含包名)
c.getSimpleName() 获得简写类名(不包含包名)
4. 反射用来做动态编程
一些程序中,有固定的执行流程
程序执行流程中的组件,可以通过配置文件来配置
SSM框架底层都是反射实现的