反射
反射
——框架设计的灵魂
反射:将类的各个组成部分封装为其他对象。

优点:
- 可以在程序运行过程中,操作这些对象
- 可以接耦,提高程序可扩展性
获取Class对象的三种方式
-
Class.forName("全类名")将字节码文件加载进内存,返回Class对象多用于配置文件,将类名定义在配置文件中。读取文件,加载类。
-
类名.class通过类名的属性class获取多用于参数传递
-
对象.getClass()该方法在Object中定义了多用于对象获取字节码
这三种方式分别对应了java代码的三个时期
同一个字节码(.class)文件在一次程序运行过程中,只会被加载一次,不论通过哪种方式获得的class对象都是同一个。
Class对象功能
获取功能
-
成员变量
Field[] getFields()获取所有public修饰的成员变量Field getField(String name)获取指定名称的public修饰的成员变量Field[] getDeclaredFields()获取所有成员变量,不考虑修饰符Field getDeclaredField(String name)获取指定成员变量,不考虑修饰符对于非public的变量,在使用前,需要忽略访问权限修饰符的安全检查
field.setAccessible(true)也称暴力反射 -
构造方法
Constructor<?>[] getConstructors()Constructor<T> getConstructor(Class<?>... var1)Constructor<?>[] getDeclaredConstructors()Constructor<T> getDeclaredConstructor(Class<?>... var1) -
成员方法
Method[] getMethods()Method getMethod(String var1, Class<?>... var2)Method[] getDeclaredMethods()Method getDeclaredMethod(String var1, Class<?>... var2) -
类名
String getName()
通俗地讲,反射就是将传统的对象调用方法、访问变量的执行过程,在形式上转换为了方法、变量拿到自己所属的对象然后去执行操作。
-
Field:成员变量
-
设置值
void set(Object var1, Object var2) -
获取值
Object get(Object var1) -
忽略访问权限修饰符的安全检查
void setAccessible(boolean var1)
-
-
Constructor:构造方法
-
创建对象
newInstance(Object... var1)如果使用空参数构造方法创建对象,操作可以简化:用Class对象的
newInstance()
-
-
Method:方法对象
-
执行方法
invoke(Object var1, Object... var2) -
获取方法名称
String getName()
-
案例
- 需求:写一个“框架”,在不能改变该类的任意代码的前提下,可以创建任意类的对象,并且执行其中任意方法
- 实现:
- 配置文件
- 反射
- 步骤
- 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
- 在程序中加载读取配置文件
- 使用反射技术来加载类文件进内存
- 创建对象
- 执行方法

浙公网安备 33010602011771号