Java中可通过反射调用私有方法:先用getDeclaredMethod获取Method对象,再调用setAccessible(true)跳过访问检查,最后用invoke执行;需注意参数类型精确匹配、异常处理及SecurityManager限制。

Java 中可以通过反射调用私有方法,核心是先获取 Method 对象,再调用 setAccessible(true) 跳过访问控制检查。
获取私有方法对象
使用 Class.getDeclaredMethod(String name, Class>... parameterTypes) 获取私有方法(注意不是 getMethod,后者只返回 public 方法)。
- 方法名必须完全匹配,包括大小写
- 参数类型要精确对应,比如
int.class不能写成Integer.class - 若方法重载,需明确传入参数类型的 Class 对象
关闭访问检查
调用 method.setAccessible(true),这是关键一步。JVM 会临时禁用对该方法的访问权限校验。
- 该操作可能受 SecurityManager 限制(生产环境通常禁用 SecurityManager,所以一般可行)
- 仅对当前
Method实例生效,不影响其他反射对象 - 不需要也不建议全局设置
setAccessible到整个类
执行私有方法
调用 method.invoke(Object obj, Object... args),其中:
立即学习“Java免费学习笔记(深入)”;
-
obj是目标实例(静态方法传null) -
args是实际参数值,类型和顺序需与方法签名一致 - 若方法有返回值,
invoke返回Object,需手动强转 - 可能抛出
IllegalAccessException、IllegalArgumentException、InvocationTargetException,需捕获处理
一个简单示例
假设有一个类:
public class Utils {
private String secret(String input) {
return "secret-" + input;
}
}
反射调用方式:
Utils utils = new Utils();
Method method = Utils.class.getDeclaredMethod("secret", String.class);
method.setAccessible(true);
String result = (String) method.invoke(utils, "test"); // 返回 "secret-test"


















