反射机制概述
Java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能。
Java反射有3个动态性质:
- 运行时生成对象实例
- 运行期间调用方法
- 运行时更改属性
Java反射机制在编译时并不确定哪个类被加载,在程序运行时才加载、探知和使用。
通过反射机制,可以实现: - 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的方法和属性;
- 在运行时调用任意一个对象的方法。
在Java程序中使用反射的基本步骤:
(1)导入java.lang.reflect.*
(2)获得需要的类的Java.lang.Class对象
(3)调用Class获得Field、Method等对象
(4)使用反射API进行操作
反射的应用
获取类的信息
(1)获取Class对象
1)调用对象的getClass()方法
Test t = new Test();
Class cla = t.getClass();
2)调用类的class属性
Class cla = Test.class;
3)使用Class类的forName()静态属性
// 添加完整的包名
Class cla = Class.forName("com.project.Test"); // 正确
Class cla = Class.forName("Test"); // 错误
(2)从Class对象获取信息
1)访问Class对应的类所包含的构造方法
方法 | 说明 |
---|---|
Constructor getConstructor( Class… params) | 返回该类型指定参数列表的public构造方法,构造方法的参数列表与params所指定的类型列表所匹配 |
Constructor[] getConstructors() | 返回该类型的所有public构造方法 |
Constructor getDeclaredConstructor( Class… params) | 返回该类型的指定参数列表的构造方法,访问级别不限 |
Constructor[] getDeclaredConstructors() | 返回该类型的所有构造方法,访问级别不限 |
2)访问Class对应的类所包含的方法
方法 | 说明 |
---|---|
Method getMethod(String name, Class… params) | 返回该实例中指定的public方法,name参数用于指定方法名称,params参数指定参数列表 |
Method[] getMethods() | 返回该实例中所有public方法 |
Method getDeclaredMethod(String name, Class… params) | 返回该实例中指定的方法,与方法的访问级别无关 |
Method[] getDeclaredMethods() | 返回该实例中的全部方法,与方法的访问级别无关 |
3)访问Class对应的类所包含的属性
4)访问Class对应的类所包含的注解
创建对象
// 使用Class对象的newInstance()方法创建对象
Class cla = Date.class;
Date d = (Date)cla.newInstance();
// 使用Constructor对象创建对象
Class cla = Date.class;
Constructor cu = cla.getConstructor(long.class);
Date d = (Date)cla.newInstance(2023);
访问类的属性
Xx getXx(Object obj)
Object get(Object obj)
void setXx(Object obj, Xx val)
void set(Object obj, Xx val)
void setAccessible(bool flag)
访问类的方法
// 其中obj是执行该方法的对象,args是执行该方法时传入该方法的参数
Object invoke(Object obj, Object args)