Java反射可通过getDeclaredMethod获取私有方法,调用setAccessible(true)绕过访问检查,再用invoke执行;需注意参数类型匹配、静态方法传null,异常会被包装为InvocationTargetException。

Java 反射机制可以通过 setAccessible(true) 绕过访问控制检查,从而获取并调用类中的私有方法。关键在于先通过 getDeclaredMethod 获取私有方法对象,再禁用 Java 的访问检查,最后用 invoke 执行。
获取私有方法对象
使用 getDeclaredMethod(注意不是 getMethod),它能获取包括私有在内的所有声明方法(不包含继承的):
-
getMethod只查找 public 方法(含父类继承的) -
getDeclaredMethod查找当前类**显式声明**的所有方法(public、protected、package-private、private),但不递归父类 - 需准确传入方法名和参数类型(如
String.class、int.class),否则抛NoSuchMethodException
绕过访问权限检查
拿到 Method 对象后,必须调用 setAccessible(true):
- 这是关键一步,否则调用
invoke会抛IllegalAccessException - 该操作仅影响当前
Method实例,不影响 JVM 全局安全策略 - JDK 9+ 在模块化环境下可能受
--illegal-access策略限制,需注意运行时参数(如设为permit或warn)
调用私有方法
调用 invoke 时传入目标实例(静态方法传 null)和实际参数:
- 若方法是静态的,第一个参数填
null - 参数类型和个数必须与方法签名严格匹配,否则抛
IllegalArgumentException - 若私有方法内部抛异常,反射会包装为
InvocationTargetException,其getCause()返回原始异常
完整示例
假设有如下类:
class Person {
private String getName(String prefix) {
return prefix + "-Alice";
}
}反射调用方式:
Person p = new Person();
Method method = Person.class.getDeclaredMethod("getName", String.class);
method.setAccessible(true); // 关键
String result = (String) method.invoke(p, "Mr"); // 返回 "Mr-Alice"Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











