假设我有这个方法:
public void callDo(FeelFreeToExtend ext){
ext.do()
}
FeelFreeToExtend在哪里:
public class FeelFreeToExtend {
public void do(){
System.out.println("DO");
}
}
现在我知道有人可以覆盖do方法,但有没有办法可以在FeelFreeToExtend
类中显式调用do方法?我认为这不是一个好主意,但它仍然很有趣。
答案 0 :(得分:5)
不,不改变所有呼叫者的字节码/代码是不可能的。如果你想总是调用FeelFreeToExtend.do()使方法最终。
答案 1 :(得分:0)
将非访问限定符“final”附加到方法(使方法最终),这将停止覆盖该方法,因此将始终从任何子类调用此方法版本。
其次,如果你只是想从派生类访问一个超类方法,即使已经覆盖了超类方法,那么只需通过附加“super”来调用该方法。在方法调用之前。例如。要从子类中调用超类的方法“display”,请使用super.display()。 (这假设你是编码子类的人)
答案 2 :(得分:0)
实际上彼得所说的并不完全正确:实际上可以使用JNI(http://java.sun.com/docs/books/jni/html/fldmeth.html#26109)执行重写方法。在JNI中,有一种名为CallNonvirtual<Type>Method
的方法正好允许这样做。
应用程序服务器或框架可以附带一个小型JNI实用程序以允许此类功能......
没有JNI,我认为这是不可能的。