25

因此,可以说我正在尝试使用Method m = plugin.getClass().getDeclaredMethod("getFile");.

但是plugin该类正在扩展另一个类,即具有该getFile方法的类。我不太确定这是否会引发NoSuchMethodException异常。

我知道plugin正在扩展的类具有 getFile 方法。对不起,如果我听起来很混乱,有点累。

4

1 回答 1

73

听起来您只需要使用getMethod而不是getDeclaredMethod. 的全部意义getDeclaredMethod在于它只找到在你调用它的类中声明的方法:

返回一个 Method 对象,该对象反映此 Class 对象表示的类或接口的指定声明方法。

getMethod有:

在 C 中搜索任何匹配的方法。如果没有找到匹配的方法,则在 C 的超类上递归调用步骤 1 的算法。

不过,那只会找到公共方法。如果您所追求的方法不是公开的,您应该自己递归类层次结构,使用getDeclaredMethodgetDeclaredMethods在层次结构中的每个类上:

Class<?> clazz = plugin.getClass();
while (clazz != null) {
    Method[] methods = clazz.getDeclaredMethods();
    for (Method method : methods) {
        // Test any other things about it beyond the name...
        if (method.getName().equals("getFile") && ...) {
            return method;
        }
    }
    clazz = clazz.getSuperclass();
}
于 2013-07-30T17:40:21.530 回答