假设我有一个类Foo
这样的
public class Foo {
public void setParameter(String name, Object value) {
// ...
}
}
我想通过反思获得setParameter
方法。
问题是,在我的代码中,当我需要获取此方法时,我只知道 ACTUAL 参数。我已经构建了一个可以为我提供Class
实际参数数组的方法。很遗憾,实际参数 Class
返回的([String.class, String.class])
数组与形式参数的Class
数组不匹配 ([String.class, Object.class])
和getDeclaredMethod
引发异常NoSuchMethodException
。
您知道任何可以帮助匹配该方法的库或代码段吗?
答案 0 :(得分:4)
您可能需要更聪明地找到要调用的方法。一种选择是从getDeclaredMethods()
迭代每个方法,首先检查方法的名称,看看是否是你要调用的方法,然后检查实际参数的数量是否与形式参数的数量相匹配,最后,如果两者都是真的,则迭代其实际参数并检查参数类是否可从您的形式参数类中分配。
但是,如果你有方法,会出现一个问题:
public void setParameter(String name, Object value);
public void setParameter(String name, String value);
因为两者都匹配该测试。
我不知道我头顶的任何库可以轻量级地处理它。虽然大多数依赖注入框架(Spring,Guice)会根据自己的需求获得一些支持,但是可能值得研究它们是如何做的。
Jon Skeet的回答here有一个我正在解释的例子。
答案 1 :(得分:2)
我只需使用getDeclaredMethods()
获取所有maethods然后根据方法名称,参数计数和最终Class.isAssignableFrom()
在代码中进行匹配,以检查参数的类型是否与签名匹配。这留下了重载方法的签名在类型上不同的情况,这些类型可以与相同的具体类型(接口或超级/子类)兼容。你必须决定你的代码是否必须支持这种极端情况。