Java 反射机制详解
反射(Reflection)是 Java 语言的一个重要特性,它允许程序在运行时获取类的内部信息,并能直接操作对象的内部属性和方法。
反射的核心类
Java 反射主要涉及以下几个核心类:
- Class 类:代表类的实体
- Field 类:代表类的成员变量
- Method 类:代表类的方法
- Constructor 类:代表类的构造方法
获取 Class 对象的三种方式
// 1. 通过类名.class获取
Class<?> clazz1 = String.class;
// 2. 通过对象.getClass()获取
String str = "Hello";
Class<?> clazz2 = str.getClass();
// 3. 通过Class.forName()获取(最常用)
Class<?> clazz3 = Class.forName("java.lang.String");
反射的基本操作
1. 创建对象
// 通过无参构造创建实例
Class<?> clazz = Class.forName("com.example.User");
Object obj = clazz.newInstance();
// 通过有参构造创建实例
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object obj2 = constructor.newInstance("张三", 25);
2. 操作字段
// 获取字段并设置值
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true); // 设置可访问私有字段
nameField.set(obj, "李四");
// 获取字段值
String name = (String) nameField.get(obj);
3. 调用方法
// 获取方法并调用
Method method = clazz.getMethod("setName", String.class);
method.invoke(obj, "王五");
// 调用静态方法
Method staticMethod = clazz.getMethod("staticMethod");
staticMethod.invoke(null);
反射的应用场景
- 动态代理:AOP 编程的基础
- 注解处理:框架中自动配置的实现
- 通用框架:如 Spring 的依赖注入
- 动态加载:插件化架构的实现
- 测试工具:Mock 测试框架
反射的优缺点
优点:
- 增加程序的灵活性
- 可以在运行时获取类的完整信息
- 可以调用私有方法和访问私有属性
缺点:
- 性能较低(比直接调用慢)
- 破坏封装性
- 增加代码复杂度
性能优化建议
- 缓存 Class 对象
- 缓存 Method/Field 对象
- 使用
setAccessible(true)减少安全检查 - 考虑使用 MethodHandle(Java 7+)
示例:通过反射调用私有方法
public class ReflectionExample {
private String secretMethod(String input) {
return "Secret: " + input;
}
public static void main(String[] args) throws Exception {
ReflectionExample example = new ReflectionExample();
Class<?> clazz = example.getClass();
// 获取私有方法
Method method = clazz.getDeclaredMethod("secretMethod", String.class);
method.setAccessible(true); // 设置可访问
// 调用方法
String result = (String) method.invoke(example, "Hello Reflection");
System.out.println(result); // 输出: Secret: Hello Reflection
}
}
反射是 Java 高级特性之一,合理使用可以极大增强程序的灵活性,但也要注意不要滥用,以免影响性能和代码可维护性。
1万+

被折叠的 条评论
为什么被折叠?



