0
這是我正面臨的一個問題。使用內部類來代理Java類
我正在寫一個插件。有一個叫做SystemObject的接口,以及一個默認的getter。
public class MyPlugin extends Plugin {
@override
public SystemObject getSystemObject() {
return super.getSystemObject();
}
}
SystemObject接口有一個名爲getScreenSize()的方法,我想代理或攔截。當我創建一個代理類時,或者自己實現這個SystemObject接口時,我會得到一個類轉換異常。
這是因爲getSystemObject(插件系統的一部分)的調用者有這在他們的代碼(通過逆向工程發現):
private void foo() {
SystemObjectImpl impl = (SystemObjectImpl)plugin.getSystemObject();
}
我的問題是:有什麼辦法我可以在SystemObject接口上委託調用?
我試着實現接口和使用java反射代理調用無濟於事。不幸的是,我不負責運行java進程,所以我不能使用代理。
乾杯!
但它創建了一個新的實例,對吧?如果foo()中的調用者使用在原始實例中設置的私有成員,該怎麼辦? – gilm
這似乎是插件系統中的一個設計缺陷,如果它可以讓你提供'SystemObject'接口的自定義實現,然後在內部依賴於默認實現......你所能做的就是試試看看發生。我試圖做的一點是,CGLIB會讓你創建一個代理對象,它是一個'instanceof SystemObjectImpl',所以'foo()'中的轉換不會失敗。 –
爲真。這是一個非常糟糕的設計。我找不到另一種解決方案。謝謝您的回答! – gilm