クラスローダーの一般的な用途は、JAR を分離することです。プラグイン ( Eclipse、Maven 2 )を使用するアプリケーションがある場合、次のような状況が発生する可能性があります。プラグイン X にはバージョン 1.0 の jar A が必要ですが、プラグイン Y にはバージョン 2.0 の同じ jar が必要です。ただし、X はバージョン 2.0 では動作しません。
クラスローダがある場合は、クラスのパーティションを作成できます (薄いブリッジで接続された孤立した島を考えてみてください。ブリッジはクラスローダです)。このようにして、クラスローダーは各プラグインが何を見ることができるかを制御できます。
プラグイン X が静的フィールドを持つクラス Foo をインスタンス化する場合、これは問題ではなく、プラグイン Y の「同じ」クラスと混同されることはありません。これは、各クラスローダーが実際にクラス Foo の独自のインスタンスを作成するためです。次に、メモリ内に 2 つのクラスがcl1.getName().equals(cl2.getName())
あります。これは、cl1 のインスタンスが cl2 のインスタンスと互換性のない代入であることを意味します。これは、 に割り当てることができないと言う奇妙なことにつながる可能性があります。true
cl1.equals(cl2)
ClassCastExceptions
org.project.Foo
org.project.Foo
離島と同じように、2 つのクラスはもう一方の存在を認識していません。異なる島で生まれ育ったクローン人間のことを考えてみてください。VM の観点からは、Class 型のインスタンスは他のオブジェクトと同様に処理されるため、問題はありません。複数存在する可能性があります。それらのいくつかが「同じ」であると考えていることは、VM にとって重要ではありません。
このパターンのもう 1 つの用途は、この方法でロードされたクラスを削除できることです。クラスローダからロードされたクラスから作成されたオブジェクトへのポインタを誰も持っていないことを確認してから、クラスローダのことも忘れてください。GCの次回の実行時に、このクラスローダによってロードされたすべてのクラスがメモリから削除されます。これにより、VM 全体を再起動することなく、アプリケーションを「リロード」できます。