在Java中,反射是指程序在运行期间能够动态获取类的结构信息并操作对象成员的一种机制。它让代码不再依赖编译期确定的类型,而是通过字符串形式的类名、方法名来完成加载、实例化与调用,是很多底层框架实现通用逻辑的核心手段。

如何理解Class对象
反射的入口是java.lang.Class类。每一个被加载到内存中的类,JVM都会为其生成一个唯一的Class对象,它保存了类的构造器、方法、字段等元数据。获取Class对象常见有三种方式:
- 使用类的class属性,如 String.class
- 通过对象调用getClass()方法
- 使用Class.forName("全限定类名")动态加载
// 获取Class对象的三种方式
Class<?> c1 = String.class;
Class<?> c2 = "abc".getClass();
Class<?> c3 = Class.forName("java.lang.String");
System.out.println(c1 == c2); // true
System.out.println(c1 == c3); // true
通过反射操作类的方法
拿到Class对象后,可以使用getMethod或getDeclaredMethod获取Method对象,再通过invoke调用目标方法。getMethod只能获取public方法,getDeclaredMethod可获取所有声明的方法,但访问非public成员前需设置setAccessible(true)。
调用无参方法示例
import java.lang.reflect.Method;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("java.util.ArrayList");
Object list = cls.getDeclaredConstructor().newInstance();
Method addMethod = cls.getMethod("add", Object.class);
addMethod.invoke(list, "hello");
Method sizeMethod = cls.getMethod("size");
int size = (int) sizeMethod.invoke(list);
System.out.println("列表大小:" + size);
}
}
调用私有方法示例
当方法被private修饰时,必须突破访问检查才能执行:
import java.lang.reflect.Method;
class Secret {
private String say() {
return "内部方法";
}
}
public class PrivateDemo {
public static void main(String[] args) throws Exception {
Class<?> cls = Secret.class;
Object obj = cls.getDeclaredConstructor().newInstance();
Method m = cls.getDeclaredMethod("say");
m.setAccessible(true); // 解除私有限制
String result = (String) m.invoke(obj);
System.out.println(result);
}
}
反射操作构造器与字段
除方法外,反射也能操作构造器和字段。通过getDeclaredConstructor传入参数类型可拿到构造器并实例化,通过getDeclaredField获取字段后用set、get读写值。
| 反射操作 | 主要API | 说明 |
|---|---|---|
| 获取类 | Class.forName | 按全限定名加载类 |
| 创建对象 | Constructor.newInstance | 替代被弃用的newInstance |
| 调用方法 | Method.invoke | 执行任意可见性方法 |
| 读写字段 | Field.get/set | 直接访问对象属性 |
反射的使用场景与注意点
反射广泛用于Spring等框架的依赖注入、MyBatis的映射、JUnit的测试发现等场景。但反射会绕过编译期检查,可能抛出运行时异常,且频繁调用有一定性能损耗。在普通业务代码中应优先考虑直接调用,仅在需要通用化、插件化设计时再使用反射。
理解反射的关键,是认识到它把“类”也变成了可操作的数据对象,让程序具备在运行时自我描述与自我驱动的能力。