[英]How to access base class method?
簡化演示代碼以顯示我的問題。
class Base {
public String toString() { return "Base"; }
};
class A extends Base {
public String toString() { return "A"; }
};
class Test {
public void test1() {
A a = new A();
Base b = (Base)a; // cast is fine, but b is the same instance as a
System.out.println(b.toString()); // want "Base", but get "A"
}
private String testB(Base b) {
return b.toString(); // this should return "Base"
}
public void test2() {
System.out.println( testB(new A()) ); // want "Base", but get "A"
}
};
我嘗試了強制轉換方法(test1)和輔助方法(test2)。
到目前為止,我發現需要Base的復制構造函數來創建一個真正的Base對象。
有沒有一個不需要重復對象的方法?
一些背景信息:
我得到一個A的實例,我知道它的基類有一個很好的方法,我想使用它而不是覆蓋的版本。 我寧願既不修改A類也不修B(雖然副本c'tor無論如何都是一個很好的增強;))
直接從A
類,你可以使用super.toString();
在Base
上執行toString()
。
但是,從A
類外部,您無法以這種方式調用超類實現,這樣做會破壞封裝。 如果你想暴露超類實現,那么你仍然可以,但你必須在A
上提供一個直接公開它的單獨方法。
即使使用基於瑣碎反射的方法, 您仍然無法訪問它:
如果底層方法是實例方法,則使用動態方法查找調用它
System.out.println(Base.class.getMethod("toString", null).invoke(new A(), null)); //Prints "A"
...並且使用MethodHandles.lookup().findSpecial
將無法在子類外部工作,因為必須在您具有私有訪問權限的情況下調用它(否則您將獲得IllegalAccessException
。)
我承認,如果沒有字節碼操作,我可能會直接在Java中使用一些奇怪而奇妙的方法,但是,即使你可以這樣做,你也應該這樣做,你當然不應該做任何事情。奇特的技術演示。
你需要創建B實例(復制構造函數),如果你使用的是A實例,無論你是否使用它都會得到“A”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.