反射
框架设计的灵魂
概念
反射就是把Java类中的各个成分映射成一个个的Java对象。
即在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性。这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。
功能
- 在运行时判断一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
好处
1)在程序运行过程中,操作封装成对象的类的各个部分
2)解耦合,提高程序的可扩展性
Java代码流程
java中主要由以下的类来实现java反射机制
注:这些类都位于java.lang.reflect包中
Class类 //代表一个类。 Field类:代表类的成员变量(成员变量也称为类的属性)
Method类 //代表类的方法
Constructor类 //代表类的构造方法
Array类 //提供了动态创建数组,以及访问数组的元素的静态方法
三个阶段:
1)源代码阶段(source)
编码—形成.java文件
编译—javac编译获得.class文件
代码尚未进内存,还在硬盘上
2)类对象阶段(class)
一个class文件生成一个class类对象
3)运行时阶段(runtime)
在内存中生成对象
使用方法
获取class对象
Class personClass=Class.forName(“Person”);
Class personClass= Person.class;
Class personClass=person.getClass();
- Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
* 多用于配置文件,将类名定义在配置文件中。读取文件,加载类 - 类名.class:通过类名的属性class获取
* 多用于参数的传递 - 对象.getClass():getClass()方法在Object类中定义着。
* 多用于对象的获取字节码的方式
注:
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。
成员变量
Field[] getFields() :获取所有public修饰的成员变量
Field getField(String name) 获取指定名称的 public修饰的成员变量
Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name)
操作
-
设置值
* void set(Object obj, Object value) -
获取值
* get(Object obj) -
忽略访问权限修饰符的安全检查
* setAccessible(true):暴力反射
构造方法
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(类<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
操作
创建对象:
T newInstance(Object… initargs)
如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
成员方法
Method[] getMethods()
Method getMethod(String name, 类<?>... parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name, 类<?>... parameterTypes)
操作
执行方法:
* Object invoke(Object obj, Object… args)
获取方法名称:
* String getName:获取方法名