Java反射getMethod有时不起作用是有原因的吗?

时间:2019-05-08 10:53:56

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

知道为什么吗?

1 个答案:

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