超类中使用默认修饰符的Java反射访问方法

时间:2010-01-20 09:56:09

标签: java reflection

是否可以通过Java反射调用超类中的no修饰符方法?

3 个答案:

答案 0 :(得分:7)

Method method = getClass().getSuperclass().getDeclaredMethod("doSomething");
method.invoke(this);

如果你有更大的层次结构,你可以使用:

Class current = getClass();
Method method = null;
while (current != Object.class) {
     try {
          method = current.getDeclaredMethod("doSomething");
          break;
     } catch (NoSuchMethodException ex) {
          current = current.getSuperclass();
     }
}
// only needed if the two classes are in different packages
method.setAccessible(true); 
method.invoke(this);

(以上示例针对名为doSomething且没有参数的方法。如果您的方法有参数,则必须将其类型作为参数添加到getDeclaredMethod(...)方法中)

答案 1 :(得分:4)

在阅读原始问题后 - 我意识到我认为你试图调用一个被覆盖的方法。这是我试图做的以及我是如何找到这个帖子的。调用基类的非重写方法应该像其他人描述的那样工作。但是,如果您尝试调用重写方法,我的答案如下:

我不认为根据

调用重写方法

http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on

最值得注意的是:

Method.invoke

如果底层方法是实例方法,则使用动态方法查找调用它,如Java语言规范,第二版,第15.12.4.4节中所述;特别是,将发生基于目标对象的运行时类型的覆盖。

答案 2 :(得分:1)

是。在调用它之前,您可能需要在Method对象上调用setAccessible(true)。