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

时间:2011-12-08 14:29:06

标签: java reflection

假设我有一个类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

您知道任何可以帮助匹配该方法的库或代码段吗?

2 个答案:

答案 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()在代码中进行匹配,以检查参数的类型是否与签名匹配。这留下了重载方法的签名在类型上不同的情况,这些类型可以与相同的具体类型(接口或超级/子类)兼容。你必须决定你的代码是否必须支持这种极端情况。