Java反射-将形式参数列表与实际参数列表相匹配



假设我有一个像这样的类别Foo

public class Foo {
    public void setParameter(String name, Object value) {
       // ...
    }
}

我想通过反射得到setParameter方法。

问题是,在我的代码中,我只知道ACTUAL参数时,我需要得到这个方法。我建立了一个小方法,可以给我Class数组的实际参数。不幸的是,从实际参数 ([String.class, String.class]) 返回的Class数组与不匹配,形式参数 ([String.class, Object.class])getDeclaredMethodClass数组引发异常NoSuchMethodException

你知道有什么库或代码片段可以帮助匹配这个方法吗?

您可能需要更聪明一点来查找要调用的方法。一种选择是遍历getDeclaredMethods()中的每个方法,首先检查方法的名称,看看它是否是您想要调用的方法,然后检查实际参数的数量是否与形式参数的数量相匹配,最后,如果这两个都为真,遍历它的实际参数,并检查参数类是否可从形式参数类中赋值。

然而,有一个问题是,如果您有以下方法会发生什么:

public void setParameter(String name, Object value);
public void setParameter(String name, String value);

,因为两者都匹配该测试。

我不知道有哪个库能以轻量级的方式处理这个问题。尽管大多数依赖注入框架(Spring, Guice)会根据需要对它提供一些支持,但研究它们是如何做的可能是值得的。

Jon Skeet在这里的回答有一个我正在解释的例子。

我只是使用getDeclaredMethods()来获取所有方法,然后在代码中根据方法名称,参数计数和最后的Class.isAssignableFrom()来检查参数类型是否与签名匹配。剩下的情况是,重载方法的签名类型不同,但可以与相同的具体类型(接口或超/子类)兼容。您必须决定您的代码是否必须支持这些极端情况。

相关内容

  • 没有找到相关文章

最新更新