簡體   English   中英

Java調用子類的前父方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM