方法显示在getDeclaredMethods()中,但是找不到getDeclaredMethod(),为什么?

时间:2011-07-26 22:21:25

标签: java reflection

我正在尝试使用代码段:

GenericModel.class.getDeclaredMethod("findById");

获取名为“findById”的方法。我知道方法存在,因为当我打电话时:

GenericModel.class.getDeclaredMethods();

该方法列在返回的数组中。

但是,在使用第一个代码片段时,我收到了java.lang.NoSuchMethodException?为什么呢?

4 个答案:

答案 0 :(得分:4)

据推测findById实际上需要参数。但是你正在寻找一个没有的名字的方法。最有可能的是:

GenericModel.class.getDeclaredMethod("findById", new Class[] { int.class });

这将匹配具有如下签名的方法:

Object findById(int id) { ... }

答案 1 :(得分:2)

getDeclaredMethod()也接收参数类型,并且您没有给它任何参数类型,而在findViewById的情况下,它是一个接收int作为参数的方法。

答案 2 :(得分:2)

根据名称判断,findById需要参数。但是,你没有传入任何内容。你需要指定findById的参数作为调用getDeclaredMethod的附加参数,因此它知道给你哪种方法 - 可能有十种不同的findById。

答案 3 :(得分:0)

在我的项目中,有几个ClassLoaders

方法参数的类相同,但是加载这些类的ClassLoaders(或ClassLoader实例)不同。

例如,ClassA的方法methodA的类型为argumentA,类型为com.example.A,由类加载器ClassLoaderA加载。

但是,在Java CLASSPATH中,您有com.example.A,由类加载器 ClassLoaderB 加载。当您调用ClassA.class.getDeclaredMethod("methodA", new Class[] { A.class });时,它将仍然无法找到该方法。 因为com.example.A加载的ClassLoaderAcom.example.A加载的ClassLoaderB不同。

自定义类加载器的父代理模型/单例模式可以用来解决问题。

我知道这与这种情况无关,但这是方法出现在getDeclaredMethods()中但无法通过getDeclaredMethod()找到的一个可能原因。