假设我有一个像这样的类别Foo
public class Foo {
public void setParameter(String name, Object value) {
// ...
}
}
我想通过反射得到setParameter
方法。
问题是,在我的代码中,我只知道ACTUAL参数时,我需要得到这个方法。我建立了一个小方法,可以给我Class
数组的实际参数。不幸的是,从实际参数 ([String.class, String.class])
返回的Class
数组与不匹配,形式参数 ([String.class, Object.class])
和getDeclaredMethod
的Class
数组引发异常NoSuchMethodException
。
你知道有什么库或代码片段可以帮助匹配这个方法吗?
您可能需要更聪明一点来查找要调用的方法。一种选择是遍历getDeclaredMethods()
中的每个方法,首先检查方法的名称,看看它是否是您想要调用的方法,然后检查实际参数的数量是否与形式参数的数量相匹配,最后,如果这两个都为真,遍历它的实际参数,并检查参数类是否可从形式参数类中赋值。
然而,有一个问题是,如果您有以下方法会发生什么:
public void setParameter(String name, Object value);
public void setParameter(String name, String value);
,因为两者都匹配该测试。
我不知道有哪个库能以轻量级的方式处理这个问题。尽管大多数依赖注入框架(Spring, Guice)会根据需要对它提供一些支持,但研究它们是如何做的可能是值得的。
Jon Skeet在这里的回答有一个我正在解释的例子。
我只是使用getDeclaredMethods()
来获取所有方法,然后在代码中根据方法名称,参数计数和最后的Class.isAssignableFrom()
来检查参数类型是否与签名匹配。剩下的情况是,重载方法的签名类型不同,但可以与相同的具体类型(接口或超/子类)兼容。您必须决定您的代码是否必须支持这些极端情况。