Java 反射(Reflection)是 Java 提供的一种机制,允许程序在运行时动态地获取类的信息(如类名、方法、属性、构造器等),并能够操作这些信息。通过反射,可以在运行时创建对象、调用方法、访问或修改字段,甚至调用私有成员。
反射的核心类是 java.lang.reflect
包中的以下类:
- Class 类:表示一个类或接口,是反射的核心。
- Method 类:表示类的方法。
- Field 类:表示类的字段(属性)。
- Constructor 类:表示类的构造方法。
反射的主要功能
- 获取类的信息:
- 获取类名、父类、接口、修饰符等信息。
- 获取类的字段、方法、构造器等。
- 动态创建对象:
- 通过
Class.newInstance()
或Constructor.newInstance()
创建类的实例。
- 通过
- 动态调用方法:
- 通过
Method.invoke()
调用类的方法,包括私有方法。
- 通过
- 访问和修改字段:
- 通过
Field.get()
和Field.set()
访问或修改类的字段,包括私有字段。
- 通过
- 操作泛型:
- 通过反射可以获取泛型类型信息。
反射的优缺点
优点:
- 灵活性:可以在运行时动态操作类和对象,适合框架和工具的开发(如 Spring、Hibernate)。
- 扩展性:可以通过配置文件或外部输入动态加载类。
缺点:
- 性能开销:反射操作比直接调用方法或访问字段慢,因为需要动态解析类信息。
- 安全性问题:反射可以访问私有成员,破坏了封装性。
- 代码可读性差:反射代码通常难以理解和维护。
示例代码
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// 获取类的 Class 对象
Class<?> clazz = Class.forName("java.util.ArrayList");
// 创建对象
Object list = clazz.getDeclaredConstructor().newInstance();
// 获取 add 方法
Method addMethod = clazz.getMethod("add", Object.class);
// 调用 add 方法
addMethod.invoke(list, "Hello, Reflection!");
// 打印结果
System.out.println(list); // 输出: [Hello, Reflection!]
}
}
THE END
暂无评论内容