也许我在这里缺少一些简单的东西,但是如何获得一个方法,其参数是使用反射的接口。
在以下情况中,newValue
将是名为List<String>
的{{1}}。所以我会打电话给foo
但是这只适用于我,如果我不使用界面并只使用addModelProperty("Bar", foo);
。如何使用LinkedList<String> foo
的界面并从newValue
获取具有接口作为参数model
的方法?
这是一个更详细的例子。 (基于:This example)
addBar(List<String> a0)
答案 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