反射: 框架设计的灵魂
- 框架:半成品软件。可以再框架的基础上进行软件开发,简化编码
- 反射:将类的各个组成部分封装为对象,这就是反射
- 好处 :
- 可以在程序运行过程中,操作这些对象。
- 可以解耦,提高程序的可扩展性。
- 好处 :
- 获取class对象的方式:
- Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件。读取文件,加载类 - 类名.class:通过类名的class属性获取
多用于参数的传递 - 对象名.getClass():getClass()方法在Object中有定义
多用于对象的获取字节码的方式
- 结论:
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论使用何种方式,加载的都是同一对象。
- Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
- class对象的功能:
- 获取功能:
-
获取成员变量
+ Field[ ] getFields() :获取所有public的成员变量。 + Filed[ ] getField(String name): 获取指定名称的public修饰的成员变量。 + Field[ ] getDeclaredFields() : 获取所有成员变量,无视修饰符。 + Field[ ] getDeclaredField(String name): 获取指定名称的成员变量,无视修饰符。
-
获取构造方法
* Constructor<?>[] getConstructors() * Constructor<T> getConstructor(类<?>... parameterTypes) * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) * Constructor<?>[] getDeclaredConstructors()
-
获取成员方法
* Method[] getMethods() * Method getMethod(String name, 类<?>... parameterTypes) * Method[] getDeclaredMethods() * Method getDeclaredMethod(String name, 类<?>... parameterTypes)
-
获取全类名
* String getName()
-
- 获取功能:
- Field: 成员变量
-
操作:
1. 设置值 void set(Object obj,Object value) 2. 获取值 get(Object obj) 3. 忽略权限访问修饰符的安全检查 setAccessible(true):暴力反射
-
- Constructor:构造方法
- 创建对象:
- T newInstance(Object… initargs)
- 如果使用空参数构造方法创建对象,操作简化为:Class对象的newInstance方法。
- 创建对象:
- Method: 方法对象
- 执行方法:
- Object invoke(Object object,Object… args)
- 获取方法的名称:
- String getName:获取方法名
- 执行方法: