Java反射调用私有方法需三步:先用getDeclaredMethod获取方法对象(指定精确参数类型),再调用setAccessible(true)解除访问限制,最后用invoke执行;注意处理NoSuchMethodException和InvocationTargetException。

Java 反射可以通过 getDeclaredMethod 获取私有方法,并通过 setAccessible(true) 绕过访问控制,再用 invoke 调用。关键在于:必须显式解除 Java 的访问检查,且需正确处理参数类型和异常。
获取私有方法对象
使用 getDeclaredMethod(注意不是 getMethod),传入方法名和精确的参数类型数组。它只查找当前类声明的方法,不包括继承的公有方法。
-
getDeclaredMethod("methodName")—— 无参方法 -
getDeclaredMethod("calculate", int.class, String.class)—— 带参方法,类型必须一一对应(基本类型用.class,如int.class;引用类型用String.class) - 若方法重载,参数类型不匹配会抛
NoSuchMethodException
解除访问限制
私有方法默认不可访问,必须调用 setAccessible(true) 禁用 JVM 的访问检查:
- 这行代码必须在
invoke前执行,否则抛IllegalAccessException - 仅对当前
Method对象生效,不影响其他反射对象 - JDK 9+ 在某些模块化场景下可能受
SecurityManager或模块导出限制(开发中较少见,但生产环境需留意)
调用私有方法
使用 method.invoke(instance, args...) 执行:
立即学习“Java免费学习笔记(深入)”;
- 第一个参数是目标实例(
null表示静态方法) - 后续参数按声明顺序传入,类型自动装箱/拆箱(如传
Integer给int参数) - 若方法抛出受检异常,会被包装为
InvocationTargetException,其getCause()返回原始异常
完整示例
假设有如下类:
public class Calculator {
private int add(int a, int b) {
return a + b;
}
}
反射调用方式:
Calculator calc = new Calculator();
Method method = Calculator.class.getDeclaredMethod("add", int.class, int.class);
method.setAccessible(true); // 关键一步
Object result = method.invoke(calc, 10, 20); // 返回 Integer(30)
System.out.println(result);


















