超类中使用默认修饰符的Javareflection访问方法

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

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(...)方法中)

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

我不认为调用重写方法是可能的

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

最为显着地:

Method.invoke

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

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