2011-12-08 30 views
3

让说我有一个类Foo这样Java反射 - 匹配形式参数列表,实际参数列表

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

我想通过反射来获得setParameter方法。

问题是,在我的代码中,我只知道实际的参数,当我需要获取此方法时。我已经建立了一个小方法,可以给我Class实际参数数组。不幸的是,从实际参数([String.class, String.class])返回Class阵列不匹配Class阵列的形式参数([String.class, Object.class])getDeclaredMethod产生异常NoSuchMethodException

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

回答

4

您可能需要有点聪明才能找到要调用的方法。一种选择是迭代getDeclaredMethods()中的每个方法,首先检查方法的名称以查看是否需要调用该方法,然后检查实际参数的数目是否与形式参数的数目匹配,最后是两者这些都是真实的,迭代其实际参数并检查参数类是否可以从您的形式参数类中分配。

的一个问题,但是,如果你有方法,会发生什么:

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

既将匹配测试。

我不知道任何能够以轻量级方式处理的头顶的图书馆。虽然大多数依赖注入框架(Spring,Guice)会根据自己的需求对它进行一些支持,但也许值得关注它们如何做。

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

+0

在我的情况下,方法来自一个接口,它只提供第一个。 – Stephan

+0

@Stephan这两种方法在一堂课中绝对可以接受。编译器将使用最匹配的方法。如果两种方法平等匹配。 (对象,字符串)和(字符串,对象),您将需要投入一个参数来指导编译器到一个特定的方法。 –

+1

+1:您可能还需要遍历超类方法,或者使用'getMethods();'获取公共方法。 –

2

我只是简单地使用getDeclaredMethods()来获取所有的方法,然后根据方法名称,参数数量在你的代码中进行匹配,最后用Class.isAssignableFrom()来检查参数的类型是否与签名匹配。这就使得重载方法的签名在可以与相同具体类型(接口或超类/子类)兼容的类型中有所不同。你必须决定你的代码是否必须支持这样的角落案例。

相关问题