Java反射调用私有方法需三步:获取Method对象(用getDeclaredMethod)、设setAccessible(true)、再invoke传实例和参数;注意参数类型匹配、异常处理及JDK模块化限制。

Java反射中获取并调用带参私有方法,核心是三步:获取 Method 对象、设置可访问(setAccessible(true))、用 invoke() 传入目标实例和参数值。
获取私有方法对象
使用 getDeclaredMethod(String name, Class>... parameterTypes),注意不是 getMethod()(后者只查 public 方法)。
例如,要获取类 User 中的私有方法 private String decrypt(String encrypted, int key):
Class<?> clazz = User.class;
Method method = clazz.getDeclaredMethod("decrypt", String.class, int.class);
开启访问权限
私有方法默认不可访问,必须显式调用:
立即学习“Java免费学习笔记(深入)”;
method.setAccessible(true);
这一步跳过 Java 的访问控制检查。JDK 9+ 在模块化环境下可能受 --illegal-access 策略影响,但开发/测试阶段通常仍可用。
调用方法并传参
用 invoke(Object obj, Object... args),第一个参数是目标实例(不能为 null,除非是 static 方法),后续为对应类型的实参:
User user = new User(); Object result = method.invoke(user, "a1b2c3", 42); // 参数顺序、类型需严格匹配
若方法返回 void,invoke 返回 null;若抛出异常,会被包装为 InvocationTargetException,其 getCause() 可获取原始异常。
常见注意事项
- 参数类型必须用包装类或基本类型字节码(如
int.class,不能写Integer.class匹配int参数) - 若方法是
static,invoke的第一个参数可传null - 捕获
Exception时建议同时处理IllegalAccessException、IllegalArgumentException、InvocationTargetException和NoSuchMethodException - 频繁调用时可缓存
Method对象并复用setAccessible(true),避免重复开销


















