class.getdeclaredmethod只能获取当前类直接声明的方法(不含继承),包括private方法,但必须调用setaccessible(true)才能调用,否则抛illegalaccessexception;参数类型需精确匹配基本类型,泛型擦除不影响查找。

Class.getDeclaredMethod 可以获取类中**直接声明**(不包括继承)的任意访问权限方法,包括 private 方法,但需注意:它默认**不忽略访问控制检查**,因此调用前必须显式设置 setAccessible(true),否则会抛出 IllegalAccessException。
确认目标方法确实在当前类中声明
该方法只查找当前类自己定义的方法,不会搜索父类或接口中的方法。例如:
-
String.class.getDeclaredMethod("getCoder")✅ ——getCoder()是String类私有声明的方法 -
String.class.getDeclaredMethod("toString")❌ ——toString()继承自Object,不在String中直接声明,会抛NoSuchMethodException
正确调用步骤(含 private 方法)
获取并调用私有方法的标准流程:
- 使用
getDeclaredMethod(String name, Class>... parameterTypes)获取Method对象 - 立即调用
method.setAccessible(true)绕过 Java 访问控制检查 - 再通过
method.invoke(instance, args...)执行(静态方法传null作 instance)
常见错误与注意事项
容易踩坑的地方:
-
参数类型必须精确匹配:比如方法是
private void foo(int x),需传int.class,不能写Integer.class(基本类型和包装类不等价) -
泛型擦除不影响查找:声明为
private <t> T getValue()</t>,获取时无需指定泛型,直接用getDeclaredMethod("getValue") -
异常要捕获完整:可能抛出
NoSuchMethodException、IllegalAccessException(未 setAccessible)、InvocationTargetException(被调方法内部异常)
示例代码片段
假设有一个类:
<font size="2">class Test {<br> private String secret() { return "shh"; }<br>}</font>
<p>获取并调用方式:</p>
<pre class="brush:php;toolbar:false;"><font size="2">Test obj = new Test();<br>Method m = Test.class.getDeclaredMethod("secret");<br>m.setAccessible(true);<br>String result = (String) m.invoke(obj); // 返回 "shh"</font>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











