什么是反射?
反射是Java语言的一种机制,它允许程序在运行时动态地获取类的信息并操作对象,包括访问和修改类的属性、调用类的方法以及创建对象实例等。通过反射,我们可以在编译时无法确定的情况下,操作和调用类的成员。
主要用途:
- 动态加载类:通过反射可以在运行时动态加载类,根据类名获取Class对象,然后使用Class对象创建对象实例。
- 获取类的信息:通过反射可以获取类的属性、方法、构造方法等信息。可以获取类的修饰符、父类、实现的接口等。
- 调用类的方法:通过反射可以动态地调用类的方法。可以通过Method对象来调用对应方法,并传递相应的参数。
- 修改类的属性:通过反射可以获取和修改类的属性。可以通过Field对象来获取和修改对应属性的值。
- 动态代理:反射和动态代理密切相关。通过反射,可以在运行时动态地生成代理对象,并在代理对象中增加额外的逻辑。
- 框架开发:许多框架都使用了反射机制,通过读取配置文件或注解来动态地加载和操作类,实现灵活的功能扩展。
反射的常用类:
- Class类:代表一个类或接口,在反射中经常用到。
- Field类:代表类的字段,可以用来访问和修改字段的值。
- Method类:代表类的方法,可以用来调用方法。
- Constructor类:代表类的构造方法,可以用来创建对象实例。
反射的常用方法:
1⃣️获取Class对象:
Class.forName(String className)
: 根据类的完全限定名获取对应的Class对象。object.getClass()
: 获取对象的Class对象。- 类名.class : 通过类名访问class
2⃣️获取类的属性:
getField(String name)
: 获取指定名称的公共字段。getDeclaredField(String name)
: 获取指定名称的字段,包括私有字段。getFields()
: 获取所有公共字段。getDeclaredFields()
: 获取所有字段,包括私有字段。
3⃣️获取类的方法:
getMethod(String name, Class<?>... parameterTypes)
: 获取指定名称和参数类型的公共方法。getDeclaredMethod(String name, Class<?>... parameterTypes)
: 获取指定名称和参数类型的方法,包括私有方法。getMethods()
: 获取所有公共方法。getDeclaredMethods()
: 获取所有方法,包括私有方法。
4⃣️获取类的构造方法:
getConstructor(Class<?>... parameterTypes)
: 获取指定参数类型的公共构造方法。getDeclaredConstructor(Class<?>... parameterTypes)
: 获取指定参数类型的构造方法,包括私有构造方法。getConstructors()
: 获取所有公共构造方法。getDeclaredConstructors()
: 获取所有构造方法,包括私有构造方法。
5⃣️创建对象实例:
newInstance()
: 创建该Class对象表示的类的实例。
6⃣️调用方法:
invoke(Object obj, Object... args)
: 调用指定对象上的该方法,并传递相应的参数。
7⃣️修改字段的值:
set(Object obj, Object value)
: 将指定对象上该字段的值设置为指定的值。