我不認爲這是可能的,因爲任何普通的類加載器實現都遵循父代優先策略,並且他們幾乎從不向着兄弟加載類。我認爲單獨的類加載器通常用於分隔不同模塊/應用程序的運行時間,以使它們在命名空間中不會發生衝突。我不想設計破壞這個基本想法的自定義類加載器。
這就是說,我認爲有一個很好的方式來實現這個使用接口和工廠模式。我們假設,ClassA
執行InterfaceA
,並且有一個名爲AFactory
的工廠,它創建/吐出InterfaceA
的對象。
我們必須確保父類加載器都加載類InterfaceA
和AFactory
。
然後CustomClassLoaderA
,寄存器與AFactory
(可能在啓動時)的ClassA
的對象:
AFactory aFactory = AFactory.getInstance():
aFactory.registerA(new ClassA());
然後,在CustomClassLoaderB
executs代碼獲取ClassA
一個實例,通過下面的代碼:
AFactory aFactory = AFactory.getInstance();
InterfaceA a = aFactory.getA()
a.invokeMethodInA();
類似的代碼可以寫爲ClassB
與CustomerClassLoaderA
共享對象。
請注意,不能在不兼容的類加載器之間共享類,但可以使用對象實例。所以,一旦創建了對象,只要有一個類型轉換爲通用接口(或LHS),就不應該在不同的類加載器中拋出它。
您也可以使用抽象類而不是接口。
看起來你只想要一個類加載器。 –