クラスローダーは階層的です。子クラス ローダーは親にクラスをロードするように要求します。親がクラスをロードできない場合は、子がクラスをロードし、一意性を維持します。親によってロードされたすべてのクラスは、子クラス ローダーからアクセスできますが、その逆は当てはまりません。疑問が頭に浮かびました: 子は親にクラスをロードするように依頼しましたが、何らかの問題により親がロードできなかったため、子はクラスを JVM にロードします。ある時点で、親はそのクラスを必要とし、明らかに親はどの子クラスローダーのクラスが JVM にロードされているかを確認できません。その場合、親もそのクラスを JVM にロードしますか? 同じクラスの一意性はどうなりますか? 問題はどのように解決されますか? 良い指針をいただければ幸いです。
3 に答える
親がロードできなかったため、子が JVM にロードします
2 つの理由により、親がクラスをロードできない可能性があります。クラスが物理的に見つからなかったか、一時的な障害が予期されていました。前者の場合ClassLoader
は a をスローしClassNotFoundException
、それは決して変化しません。後者の場合、別の例外が親からスローされ、子クラス ローダーが中断されます。したがって、そのような状況は決して発生してはなりません。
同じクラスの一意性はどうなりますか?
この場合ではありませんが、技術的には可能です。特に、複雑なクラス ローダー階層を持つアプリケーション サーバーでは可能です。基本的に、2 つのクラス ローダーが同じクラスをロードできますが、これらは互換性がありません (取得できますClassCastException
)。
あなたの場合、JVM には同じ名前で異なるClass
インスタンスを持つ 2 つのクラスがあります。これらのクラスは、あらゆる面で異なると見なされます。「クロスクラスローダー」に参照を割り当てようとすると、次のような例外が発生します
Cannot cast class Foo to class Foo
これは理論上の問題ではありません。この種の例外は、Java EE/EJB ドメインでときどき見られます。
等しいクラスは、次のすべての点で等しい必要があります。 1. クラスの名前は同じである必要があります。 2. パッケージの名前は同じである必要があります。 3. クラスをロードする classLoader は同じである必要があります。
したがって、同じ classLoader によってロードされないクラスは、同じクラスではありません! このようにして、同じアプリケーション サーバーに異なるバージョンの 2 つの jar をインポートできます。これは、異なる classLoader によって行われます。
それが役に立てば幸い...