从 0 学 Java(22):反射调用静态方法与静态变量的特殊处理
·
反射调用静态方法与静态变量的特殊处理
在 Java 反射机制中,静态方法和静态变量属于类级别,调用时无需创建实例对象。以下是关键处理步骤和注意事项:
一、静态方法调用
-
获取
Method对象
通过Class.getDeclaredMethod()获取方法对象,需指定方法名和参数类型:Class<?> clazz = MyClass.class; Method staticMethod = clazz.getDeclaredMethod("methodName", parameterTypes); -
关键设置
静态方法调用需将invoke()的第一个参数设为null:staticMethod.invoke(null, args); // 第一个参数 null 表示类级别调用 -
私有方法访问
若方法为private,需解除访问限制:staticMethod.setAccessible(true); // 突破私有访问权限
二、静态变量访问
-
获取
Field对象
通过Class.getDeclaredField()获取字段对象:Field staticField = clazz.getDeclaredField("fieldName"); -
读写操作
- 读取值:
field.get(null)Object value = staticField.get(null); // 参数 null 表示类级别 - 修改值:
field.set(null, newValue)staticField.set(null, newValue); // 修改静态变量值
- 读取值:
-
私有字段处理
同样需解除访问限制:staticField.setAccessible(true); // 允许访问私有字段
三、完整代码示例
import java.lang.reflect.*;
class MyClass {
private static String staticVar = "Initial";
private static void staticMethod(String msg) {
System.out.println("静态方法执行: " + msg);
}
}
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
Class<?> clazz = MyClass.class;
// 调用静态方法
Method method = clazz.getDeclaredMethod("staticMethod", String.class);
method.setAccessible(true);
method.invoke(null, "Hello Reflection!"); // 输出:静态方法执行: Hello Reflection!
// 修改静态变量
Field field = clazz.getDeclaredField("staticVar");
field.setAccessible(true);
field.set(null, "Modified"); // 修改值
// 验证修改结果
System.out.println("静态变量值: " + field.get(null)); // 输出:静态变量值: Modified
}
}
四、注意事项
- 性能影响
反射操作比直接调用慢约 $10^2 \sim 10^3$ 倍,高频场景慎用 - 安全限制
在安全管理器环境下需配置权限策略 - 类型安全
反射绕过编译器检查,需确保参数类型匹配:// 错误示例:类型不匹配导致 IllegalArgumentExceptio field.set(null, 123); // 静态Var是String类型
关键点总结:静态成员操作的核心是用
null替代实例对象,并通过setAccessible(true)解除私有访问限制。实际开发中应优先考虑直接调用,反射仅用于框架开发等特殊场景。
更多推荐
所有评论(0)