2012-08-28 70 views
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進程,所以我不能使用代理。

乾杯!

回答

1

你可以使用像CGLIB這樣的東西來創建一個代理類,它延伸SystemObjectImpl

+0

但它創建了一個新的實例,對吧?如果foo()中的調用者使用在原始實例中設置的私有成員,該怎麼辦? – gilm

+0

這似乎是插件系統中的一個設計缺陷,如果它可以讓你提供'SystemObject'接口的自定義實現,然後在內部依賴於默認實現......你所能做的就是試試看看發生。我試圖做的一點是,CGLIB會讓你創建一個代理對象,它是一個'instanceof SystemObjectImpl',所以'foo()'中的轉換不會失敗。 –

+0

爲真。這是一個非常糟糕的設計。我找不到另一種解決方案。謝謝您的回答! – gilm