2009-04-11 15 views
1

我可以在Java中使用符合我自定義的 接口之一的外部類並將其「強制」到該接口嗎?Java:使用符合我的接口的外部類

例子:

public class YouCanNotChangeMe_IAmNotYours{ 
    public void doSomethingSpecial(); 
} 

public interface MyInterface{ 
    void doSomethingSpecial(); 
} 

我可以使用,在國外的地方所在班級我的接口預期?

爲什麼我需要這個呢?

我希望在運行時動態地重新加載一些JAR的新版本, as I've mentioned here

現在,服務器知道所有的接口(在編譯時知道前一版本的JAR文件 )。問題是,在運行時加載該JAR的更新版本 後,如果這些「新」類不知道編譯時已知接口,則它們將作爲 。

例子:一個老班,命名爲HelloClass(在編譯時已知)實現 接口HelloInterface,但新加載HelloClass 實現同一界面!

回答

1

您可以擴展外部類(假設它不是最​​終的)並使該類實現接口。

或者你也可以實現自己的包裝周圍的接口:

public class ForeignClassWrapper implements MyInterface { 
    private final YouCanNotChangeMe_IAmNotYours delegate; 

    public ForeignClassWrapper(YouCanNotChangeMe_IAmNotYours delegate) { 
    this.delegate = delegate; 
    } 

    public void doSomethingSpecial() { 
    delegate.doSomethingSpecial(); 
    } 
} 

更普遍的,你可以使用反射獲得同樣的效果(這樣你就不會需要在包裝類中硬編碼YouCanNotChangeMe_IAmNotYours)。

+0

我認爲它不會。我需要整件事來重新加載JAR。 問題是:重新加載後, 一個類「不是自己」了。因此,對原始類進行子類化將與重新加載的類沒有任何共同之處。 – 2009-04-11 08:32:06

+0

<...不會這樣做... – 2009-04-11 08:32:44

0

除非我錯了,這聽起來像你需要重新考慮你的容器和ClassLoader設計。您試圖實現與您的平均servlet容器支持的功能相同的功能,因此可能需要考慮靈感。

至於具體問題:實例類型X如果x.getClass()getClassLoader()== A.class.getClassLoader()類的一個實例。因此,即使兩個或多個對象可能是一個的,爪哇將它們視爲不同的類型,如果他們有不同的類加載器。

這聽起來像你想轉換爲應該是在一個共同的基礎(或系統)的ClassLoader的接口。