2013-07-30 78 views
0

以下兩個方案的類加載器和它們的類之間的權限級別:的ClassLoader:

  • CustomClassLoaderA負載ClassA的
  • CustomClassLoaderB負載ClassB的

到目前爲止好,但:

  • CustomClassLoaderA應該能夠訪問ClassB
  • CustomClassLoaderB應該能夠訪問ClassA

有沒有人有一個想法我可以在Java中完成這種情況?還有一個限制是兩個CustomClassLoader在同一個級別上。說,他們有相同的父級ClassLoader。

非常感謝你提前,夥計們!

+0

看起來你只想要一個類加載器。 –

回答

3

我不認爲這是可能的,因爲任何普通的類加載器實現都遵循父代優先策略,並且他們幾乎從不向着兄弟加載類。我認爲單獨的類加載器通常用於分隔不同模塊/應用程序的運行時間,以使它們在命名空間中不會發生衝突。我不想設計破壞這個基本想法的自定義類加載器。

這就是說,我認爲有一個很好的方式來實現這個使用接口和工廠模式。我們假設,ClassA執行InterfaceA,並且有一個名爲AFactory的工廠,它創建/吐出InterfaceA的對象。

我們必須確保父類加載器都加載類InterfaceAAFactory

然後CustomClassLoaderA,寄存器與AFactory(可能在啓動時)的ClassA的對象:

AFactory aFactory = AFactory.getInstance(): 
aFactory.registerA(new ClassA()); 

然後,在CustomClassLoaderB executs代碼獲取ClassA一個實例,通過下面的代碼:

AFactory aFactory = AFactory.getInstance(); 
InterfaceA a = aFactory.getA() 
a.invokeMethodInA(); 

類似的代碼可以寫爲ClassBCustomerClassLoaderA共享對象。

請注意,不能在不兼容的類加載器之間共享類,但可以使用對象實例。所以,一旦創建了對象,只要有一個類型轉換爲通用接口(或LHS),就不應該在不同的類加載器中拋出它。

您也可以使用抽象類而不是接口。

+0

謝謝..你說服我使用另一種策略來完成場景! – MKorsch