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),它们几乎总是允许您在编辑器中阅读文档。这使您很容易理解为什么代码不能按预期工作。