通常のクラスローダーの実装は親優先ポリシーに従っており、クラスをロードするために兄弟に目を向けることはほとんどないため、これは可能ではないと思います。名前空間で競合しないように、異なるモジュール/アプリケーションのランタイムを分離するために、通常、個別のクラスローダーが使用されると思います。この基本的な考え方を損なうようなカスタム クラス ローダーを設計したくはありません。
とはいえ、インターフェイスとファクトリ パターンを使用してこれを実現する素晴らしい方法があると思います。ClassAを実装し、のオブジェクトを作成/吐き出すInterfaceAというファクトリがあるとしましょう。AFactoryInterfaceA
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) が存在する限り、別のクラス ローダーにオブジェクトを投げても問題はないはずです。
インターフェイスの代わりに抽象クラスを使用することもできます。