java可通过反射调用私有方法,需用getdeclaredmethod()获取方法对象,调用setaccessible(true)绕过访问检查,再用invoke()执行;注意处理nosuchmethodexception、illegalaccessexception等异常。

Java 可以通过反射调用私有方法,核心是使用 setAccessible(true) 绕过 Java 的访问控制检查。
获取私有方法对象
用 Class.getDeclaredMethod() 获取私有方法(注意不是 getMethod(),后者只查 public 方法):
-
getDeclaredMethod("methodName", paramTypes...)—— 参数类型必须精确匹配,如String.class、int.class - 若方法重载,需明确指定参数类型,否则抛
NoSuchMethodException
关闭访问检查
拿到 Method 对象后,必须调用:
-
method.setAccessible(true);—— 这是关键一步,否则调用时会抛IllegalAccessException - 该操作仅影响当前 Method 实例,不影响 JVM 其他安全策略(如 SecurityManager 启用时可能仍被拦截)
执行私有方法
使用 method.invoke(instance, args...) 调用:
- 静态私有方法:第一个参数传
null - 实例私有方法:第一个参数传目标对象(不能为 null)
- 参数值顺序和类型需与方法签名一致;基本类型自动装箱/拆箱,但要注意 null 传给基本类型参数会报错
异常处理要点
反射调用私有方法可能抛出多种异常,建议统一捕获并处理:
-
NoSuchMethodException:方法名或参数类型写错 -
IllegalAccessException:忘了调用setAccessible(true) -
InvocationTargetException:私有方法内部抛出异常,其原因可通过e.getCause()获取 -
NullPointerException:目标对象为 null(非静态方法)或参数不匹配
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











