[英]Java calling pre-parent method of child class
在c ++中,您可以從任何普通的父類中輕松調用eny oveloaded方法。 我是如何在Java中做那樣思考的?
例:
class A {
public void f() {
System.out.println("A");
}
};
class B extends A {
@Override
public void f() {
super.f();
System.out.println("B");
}
};
class C extends B {
@Override
public void f() {
super.f(); // how to invoke f() method of A class avoiding B class?
System.out.println("C");
}
};
因此調用cf()將打印“ABC”。
如何從A類的C類方法調用避免B類的相同重載方法?
在Java中,你不能沒有黑客攻擊,因為C不僅僅是A而不是A.如果你能在C ++中做到這一點,那么恕我直言! 這表明您的層次結構搞砸了,C應該只是A而不是B.
如果你真的必須這樣做,你可以像這樣添加一個方法,這樣你就可以繞過Bf();
protected void superF() {
super.f();
}
並從C調用此
可以使用ASM生成字節代碼來執行此操作。 字節代碼允許您調用任何級別的父級,而Java則不會。
正如其他人已經指出的那樣,你不能直接得到它(例如super.super.
不起作用)。
you can mess around with: 這是一個你可以搞亂的 :
try
{
Class<?> s = this.getClass();
while ( !"java.lang.Object".equals(s.getSuperclass().getName()) )
{
s = s.getSuperclass();
}
Method m = s.getMethod(Thread.currentThread().getStackTrace()[1].getMethodName(), (Class<?>[])null);
if ( m != null )
{
m.invoke(s.newInstance()); // This is the actual call to the 'super' method.
}
}
catch ( Exception e )
{
e.printStackTrace();
}
它不漂亮,但對於簡單的類和方法,它的工作原理;)
PS。 這個hack只支持沒有任何參數的方法。 如果需要支持參數,則需要使用getMethods()
方法。 此外,如果最終的“超類”不支持該方法,它也將無法工作,但您可以在while循環中添加代碼來檢查並捕獲支持它的最后一個超類。
不,這不能在java中完成。 但是,如果要完成它,請在類C的重寫方法f()中創建類A的實例,並使用該對象調用類A的f()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.