使用反射来获得方法;找不到接口类型的方法参数

时间:2010-08-30 16:45:09

标签: java reflection

也许我在这里缺少一些简单的东西,但是如何获得一个方法,其参数是使用反射的接口。

在以下情况中,newValue将是名为List<String>的{​​{1}}。所以我会打电话给foo但是这只适用于我,如果我不使用界面并只使用addModelProperty("Bar", foo);。如何使用LinkedList<String> foo的界面并从newValue获取具有接口作为参数model的方法?

这是一个更详细的例子。 (基于:This example

addBar(List<String> a0)

3 个答案:

答案 0 :(得分:11)

您实际上必须搜索模型中的所有方法,并找到与您拥有的参数兼容的方法。它有点乱,因为一般情况下可能会有更多的那个。

如果您只对公共方法感兴趣,getMethods()方法最容易使用,因为它为您提供了所有可访问的方法,而无需走过类层次结构。

Collection<Method> candidates = new ArrayList<Method>();
String target = "add" + propertyName;
for (Method m : model.getClass().getMethods()) {
  if (target.equals(m.getName())) {
    Class<?>[] params = m.getParameterTypes();
    if (params.length == 1) {
      if (params[0].isInstance(newValue))
        candidates.add(m);
    }
  }
}
/* Now see how many matches you have... if there's exactly one, use it. */

答案 1 :(得分:6)

如果您不介意向Apache Commons添加依赖项,可以使用MethodUtils.getMatchingAccessibleMethod(Class clazz, String methodName, Class[] parameterTypes)

如果您介意添加此依赖项,您至少会发现查看how this method is implemented非常有用。

答案 2 :(得分:0)

Another answer建议使用Apache Commons通过1-0获取Method对象。

但是,您似乎没有将MethodUtils.getMatchingAccessibleMethod对象用于立即调用实例之外的任何事情。在这种情况下,您可以改用Apache Commons Lang的MethodUtils.invokeMethod(Object object, String methodName, Object... args)。不仅返回Method对象,还调用给定对象上的方法。

Method