Java反射getMethod有时不起作用有什么原因吗?
我有一些使用Java反射getMethod有时不起作用有什么原因吗?,java,reflection,Java,Reflection,我有一些使用reflection的代码,我想用它来调用setter方法。下面是我的代码: Method getObjectMethod = entityClass.getMethod(GET_METHOD_NAME); if (getObjectMethod != null){ Object p = getObjectMethod.invoke(obj); Class<?> pClass = p.getClass(); Method setMethod
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");
}
或
我有个例外
知道为什么吗?假设你有一门课:
class Foo {
void bar(int i) {}
void bar(String s) {}
}
并致电:
Method bar = Foo.class.getDeclaredMethod("bar");
应该返回哪个方法?有两种可能的匹配,一种接受int
,另一种接受字符串。只有当您有这样一个方法(没有参数)时,上述方法才会起作用:
这意味着,当您希望通过反射获取方法时,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);
假设您有一个类:
class Foo {
void bar(int i) {}
void bar(String s) {}
}
并致电:
Method bar = Foo.class.getDeclaredMethod("bar");
应该返回哪个方法?有两种可能的匹配,一种接受int
,另一种接受字符串。只有当您有这样一个方法(没有参数)时,上述方法才会起作用:
这意味着,当您希望通过反射获取方法时,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);
下面是getDeclaredMethod()的javadoc:。仔细阅读其签名以及文件。这是getDeclaredMethod()的javadoc:。仔细阅读其签名以及文件。它有答案。非常好的答案!谢谢,对不起,我应该阅读文档,而不是遵循示例。同意它是复制品。@gringgordo不客气。我建议您使用IDE(我更喜欢IntelliJ IDEA),它们几乎总是允许您在编辑器中阅读文档。这让你很容易明白为什么代码没有按预期工作。回答得很好!谢谢,对不起,我应该阅读文档,而不是遵循示例。同意它是复制品。@gringgordo不客气。我建议您使用IDE(我更喜欢IntelliJ IDEA),它们几乎总是允许您在编辑器中阅读文档。这使您很容易理解为什么代码不能按预期工作。