2

クラスローダーは階層的です。子クラス ローダーは親にクラスをロードするように要求します。親がクラスをロードできない場合は、子がクラスをロードし、一意性を維持します。親によってロードされたすべてのクラスは、子クラス ローダーからアクセスできますが、その逆は当てはまりません。疑問が頭に浮かびました: 子は親にクラスをロードするように依頼しましたが、何らかの問題により親がロードできなかったため、子はクラスを JVM にロードします。ある時点で、親はそのクラスを必要とし、明らかに親はどの子クラスローダーのクラスが JVM にロードされているかを確認できません。その場合、親もそのクラスを JVM にロードしますか? 同じクラスの一意性はどうなりますか? 問題はどのように解決されますか? 良い指針をいただければ幸いです。

4

3 に答える 3

2

親がロードできなかったため、子が JVM にロードします

2 つの理由により、親がクラスをロードできない可能性があります。クラスが物理的に見つからなかったか、一時的な障害が予期されていました。前者の場合ClassLoaderは a をスローしClassNotFoundException、それは決して変化しません。後者の場合、別の例外が親からスローされ、子クラス ローダーが中断されます。したがって、そのような状況は決して発生してはなりません。

同じクラスの一意性はどうなりますか?

この場合ではありませんが、技術的には可能です。特に、複雑なクラス ローダー階層を持つアプリケーション サーバーでは可能です。基本的に、2 つのクラス ローダーが同じクラスをロードできますが、これらは互換性がありません (取得できますClassCastException)。

于 2012-08-26T16:53:42.320 に答える
0

あなたの場合、JVM には同じ名前で異なるClassインスタンスを持つ 2 つのクラスがあります。これらのクラスは、あらゆる面で異なると見なされます。「クロスクラスローダー」に参照を割り当てようとすると、次のような例外が発生します

Cannot cast class Foo to class Foo

これは理論上の問題ではありません。この種の例外は、Java EE/EJB ドメインでときどき見られます。

于 2012-08-26T16:55:37.950 に答える
0

等しいクラスは、次のすべての点で等しい必要があります。 1. クラスの名前は同じである必要があります。 2. パッケージの名前は同じである必要があります。 3. クラスをロードする classLoader は同じである必要があります。

したがって、同じ classLoader によってロードされないクラスは、同じクラスではありません! このようにして、同じアプリケーション サーバーに異なるバージョンの 2 つの jar をインポートできます。これは、異なる classLoader によって行われます。

それが役に立てば幸い...

于 2013-02-14T12:21:20.300 に答える