可通过反射调用私有方法:先用getdeclaredmethod()获取method对象,再调用setaccessible(true)绕过访问控制,最后用invoke()执行并处理返回值及异常。

可以直接通过反射绕过访问控制,调用对象的私有方法。核心在于获取 Method 对象后调用 setAccessible(true) 关闭 Java 的语言访问检查,再用 invoke() 执行。
获取私有方法对象
必须使用 getDeclaredMethod()(不是 getMethod()),因为它能获取本类声明的所有方法,包括 private、protected 和包级方法。
-
clazz.getDeclaredMethod("methodName"):无参方法 -
clazz.getDeclaredMethod("methodName", String.class, int.class):带参方法,参数类型必须精确匹配(如基本类型不能写成包装类)
解除访问限制
私有方法默认不可被外部反射调用,需显式授权:
- 调用
method.setAccessible(true),这会临时关闭 JVM 的访问检查机制 - 该操作只影响当前
Method实例,不影响其他反射对象或编译期行为 - 若运行在安全管理器(SecurityManager)启用的环境中,可能抛出
SecurityException
执行方法并处理返回值
使用 invoke() 触发调用,注意传参格式和异常处理:
- 第一个参数是目标对象实例(不能为
null,除非是静态方法) - 第二个参数是
Object[]类型的实参数组;无参可传null或new Object[0] - 返回值为
Object类型,需按实际类型强转(如方法返回String,就写(String) method.invoke(obj, args)) - 必须捕获
IllegalAccessException、IllegalArgumentException、InvocationTargetException
完整示例代码
(以调用 PrivateClass.sayHello(String) 为例)
PrivateClass obj = new PrivateClass();
Class> clazz = obj.getClass();
Method method = clazz.getDeclaredMethod("sayHello", String.class);
method.setAccessible(true);
String result = (String) method.invoke(obj, "Alice");
System.out.println(result); // 输出: hello Alice










