我有一些使用reflection
的代码,我想用它们来调用setter
方法。下面是我的代码:
Method getObjectMethod = entityClass.getMethod(GET_METHOD_NAME);
if (getObjectMethod != null){
Object p = getObjectMethod.invoke(obj);
Class<?> pClass = p.getClass();
Method setMethod = null;
Method[] methodList = pClass.getDeclaredMethods();
for (Method met: methodList){
if (met.getName().equals(SET_METHOD_NAME)) {
setVersionMethod = met;
break;
}
}
if (setMethod != null){
setMethod.invoke(p, "UPDATED BY REFLECTION5");
}
这很好。但是,当我尝试将循环替换为:
setMethod = pClass.getDeclaredMethod(SET_METHOD_NAME);
或
setMethod = pClass.getMethod(SET_METHOD_NAME);
我收到一个NoSuchMethodException。
知道为什么吗?
答案 0 :(得分:4)
假设您有一堂课:
class Foo {
void bar(int i) {}
void bar(String s) {}
}
然后致电:
Method bar = Foo.class.getDeclaredMethod("bar");
应该返回哪个方法?有两种可能的匹配方式,一种接受int
,另一种接受String
。仅当您具有这样的方法(无参数)时,以上方法才有效:
void bar() {}
这意味着当您想通过反射获取Method
时,getDeclaredMethod()
会强制您传递要获取的方法的参数类型:
Method barInt = Foo.class.getDeclaredMethod("bar", int.class);
Method barString = Foo.class.getDeclaredMethod("bar", String.class);
在您的情况下,您可能想要的是这样:
setMethod = pClass.getDeclaredMethod(SET_METHOD_NAME, String.class);