JDK8中getDeclaredMethod报NoSuchMethodException但getDeclaredMethods正常的原因
问题原因分析
从运行输出的方法签名可以看到,ThreadLocalRandom的advanceProbe方法实际是带一个int类型参数的,完整签名为:
static final int java.util.concurrent.ThreadLocalRandom.advanceProbe(int)
核心原因
getDeclaredMethod(String name, Class<?>... parameterTypes)方法要求精确匹配方法名和参数类型列表。你调用getDeclaredMethod("advanceProbe")时没有传入参数类型,JVM会默认寻找无参的advanceProbe方法,但类中不存在这个版本,因此抛出NoSuchMethodException。getDeclaredMethods()会返回类中所有声明的方法(不管访问权限、是否带参数),所以能找到这个带int参数的advanceProbe方法。
正确调用方式
如果要通过getDeclaredMethod获取该方法,需要指定对应的参数类型:
Method advanceProbe2 = clazz.getDeclaredMethod("advanceProbe", int.class);
内容的提问来源于stack exchange,提问作者luguo
相关产品推荐
相关产品推荐

