1. 反射机制的本质与核心价值
Java反射机制就像程序员的"X光透视仪",它允许我们在运行时动态获取类的完整结构信息并操作对象。这种能力打破了传统编码中"编译时确定一切"的限制,为框架设计、动态代理等高级特性提供了基础支撑。
反射API主要位于java.lang.reflect包中,核心类包括:
- Class:类的运行时描述
- Field:类的成员变量
- Method:类的方法
- Constructor:类的构造器
重要提示:反射会绕过Java的访问控制检查,即使private成员也能被访问,这既是它的强大之处,也是潜在的安全风险点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 反射核心操作全解析
2.1 获取Class对象的四种途径
- 类名.class语法(最推荐):
java复制Class<String> strClass = String.class;
编译时类型检查,性能最佳。
- 对象.getClass():
java复制String s = "";
Class<?> strClass = s.getClass();
- Class.forName()(最灵活):
java复制Class<?> jdbcDriver = Class.forName("com.mysql.jdbc.Driver");
需要处理ClassNotFoundException。
- 类加载器的loadClass():
java复制Class<?> loadedClass = ClassLoader.getSystemClassLoader().loadClass("java.lang.String");
2.2 方法调用的艺术
反射调用方法时,需要特别注意参数匹配问题:
java复制Method substring = String.class.getMethod("substring", int.class, int.class);
String result = (String) substring.invoke("HelloWorld", 3, 7);
踩坑记录:getMethod()只能获取public方法,要获取私有方法需使用getDeclaredMethod()并设置accessible为true。
2.3 字段操作实战
字段操作典型流程:
java复制Field field = targetClass.getDeclaredField("privateField");
field.setAccessible(true); // 突破private限制
Object value = field.get(targetObj);
field.set(targetObj, newValue);
3. 反射性能优化策略
3.1 缓存重用机制
反射API调用开销主要来自:
- 安全检查(每次调用都执行)
- 方法查找(需要遍历类结构)
- 参数装箱/拆箱
优化方案:
java复制// 缓存Method对象
private static final Method hashCodeMethod;
static {
try {
hashCodeMethod = Object.class.getMethod("hashCode");
} catch (Exception e) {
throw new Error(e);
}
}
