我正在尝试使用代码段:
GenericModel.class.getDeclaredMethod("findById");
获取名为“findById”的方法。我知道方法存在,因为当我打电话时:
GenericModel.class.getDeclaredMethods();
该方法列在返回的数组中。
但是,在使用第一个代码片段时,我收到了java.lang.NoSuchMethodException?为什么呢?
答案 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
加载的ClassLoaderA
与com.example.A
加载的ClassLoaderB
不同。
自定义类加载器的父代理模型/单例模式可以用来解决问题。
我知道这与这种情况无关,但这是方法出现在getDeclaredMethods()中但无法通过getDeclaredMethod()找到的一个可能原因。