是否可以通过Java反射调用超类中的no修饰符方法?
答案 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)。