java - Java 反射 getMethod 有时不起作用的原因是什么?

标签 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 = 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。

知道为什么吗?

最佳答案

假设你有一个类:

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);

关于java - Java 反射 getMethod 有时不起作用的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56039087/

相关文章:

java - Right (LSB) radix -- 如何处理 2 的补码?

java - 为什么 HTML 图像标签在文件协议(protocol)中不起作用?

c# - 为什么通过反射找不到IList类型上的GetEnumerator()方法?

java - 使用 Varargs,我可以根据变量名称为变量赋值吗?

c# - 使用反射查找通用方法时发现模糊匹配

java - 泛型映射 : read and write

java - 如何使用 criteriaBuilder 检查集合中的实体是否包含特定值?

java - 自动调整标签内容的大小

java - 在 playframework Controller 中调用静态函数时验证错误

c# - 使用反射将通用列表的实例添加到对象