0

次のシナリオ:

  • CustomClassLoaderA は ClassA をロードします
  • CustomClassLoaderB は ClassB をロードします

ここまでは順調ですが、

  • CustomClassLoaderA は ClassB にアクセスできる必要があります
  • CustomClassLoaderB は ClassA にアクセスできる必要があります

Javaでこのシナリオを達成する方法を知っている人はいますか? もう 1 つの制限は、2 つの CustomClassLoader が同じレベルにあることです。たとえば、同じ親 ClassLoader を持っているとします。

よろしくお願いします。

4

1 に答える 1

4

通常のクラスローダーの実装は親優先ポリシーに従っており、クラスをロードするために兄弟に目を向けることはほとんどないため、これは可能ではないと思います。名前空間で競合しないように、異なるモジュール/アプリケーションのランタイムを分離するために、通常、個別のクラスローダーが使用されると思います。この基本的な考え方を損なうようなカスタム クラス ローダーを設計したくはありません。

とはいえ、インターフェイスとファクトリ パターンを使用してこれを実現する素晴らしい方法があると思います。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) が存在する限り、別のクラス ローダーにオブジェクトを投げても問題はないはずです。

インターフェイスの代わりに抽象クラスを使用することもできます。

于 2013-07-30T14:25:48.723 に答える