通常のクラスローダーの実装は親優先ポリシーに従っており、クラスをロードするために兄弟に目を向けることはほとんどないため、これは可能ではないと思います。名前空間で競合しないように、異なるモジュール/アプリケーションのランタイムを分離するために、通常、個別のクラスローダーが使用されると思います。この基本的な考え方を損なうようなカスタム クラス ローダーを設計したくはありません。
とはいえ、インターフェイスとファクトリ パターンを使用してこれを実現する素晴らしい方法があると思います。ClassA
を実装し、のオブジェクトを作成/吐き出すInterfaceA
というファクトリがあるとしましょう。AFactory
InterfaceA
InterfaceA
クラスとAFactory
両方が親クラスローダーによってロードされていることを確認する必要があります。
次にCustomClassLoaderA
、 のオブジェクトを (おそらく起動時に) に登録しClassA
ますAFactory
。
AFactory aFactory = AFactory.getInstance():
aFactory.registerA(new ClassA());
次に、 で実行されるコードは、次のコードによって のCustomClassLoaderB
インスタンスを取得します。ClassA
AFactory aFactory = AFactory.getInstance();
InterfaceA a = aFactory.getA()
a.invokeMethodInA();
ClassB
と のオブジェクトを共有するために同様のコードを書くことができますCustomerClassLoaderA
。
互換性のないクラス ローダー間でクラスを共有することはできませんが、オブジェクト インスタンスは共有できることに注意してください。したがって、オブジェクトが作成されると、そのオブジェクトを型キャストするための共通のインターフェース (または LHS) が存在する限り、別のクラス ローダーにオブジェクトを投げても問題はないはずです。
インターフェイスの代わりに抽象クラスを使用することもできます。