25

クラスローダーの背後にある概念について、誰かが私に良いリソースを指摘したり、説明したりできますか? クラスローダーhttp://www.onjava.com/lpt/a/5586で次のリソースを見つけましたが、それでも助けにはなりません。次の質問はばかげているように見えるかもしれませんが、答えようとするといつも混乱します。

  • 開発者がカスタム クラス ローダーを作成するのはなぜですか? Bootstrap クラス ローダーを呼び出してカスタム クラスを呼び出さないのはなぜですか? カスタム クラス ローダーを定義する必要性は何ですか?

  • クラスローダの種類が多いのはなぜですか? 例: Bootsrap、Comman、Catalina クラスローダーなど、

    前もって感謝します。

4

8 に答える 8

46

カスタムクラスローダーを作成する正当な理由は次のとおりです。

  1. 型にはまらないソースからクラスをロードしたい (たとえば、1 つのクラスのバイトコードがデータベースに格納されているか、ネットワークを介して、またはpidgeons - MessengerPidgeonClassLoader によって 0 と 1 として運ばれる)。URLClassLoaderなど、このような場合に備えて API にはすでにいくつかの ClassLoader 実装があります。

  2. クラスをロードするには、別の階層を定義する必要があります。ClassLoader のデフォルトの実装は、最初に検索を親に委任し、次にクラス自体をロードしようとします。別の階層が必要な場合もあります。これが、OSGI と Eclipse が独自の ClassLoaders を持っている理由です。マニフェスト .MF ファイルは、すべてのタイプの奇妙な階層パス (たとえば、buddy-classloading) を定義します。すべての Eclipse クラスローダーは、BundleClassLoader インターフェースを実装し、Eclipse プラグイン内のリソースを見つけるための追加コードをいくつか持っています。

  3. バイトコードに何らかの変更を加える必要があります。バイトコードが暗号化されている可能性があり、その場で暗号化を解除します (実際に役立つわけではありませんが、試してみました)。オンザフライでロードされたクラスに「パッチ」を適用したい場合があります (A la JDO バイトコード拡張)。

メモリからクラスをアンロードする必要がある場合、または実行時に定義が変更される可能性があるクラスをロードする必要がある場合は、システム クラスローダーとは異なるクラスローダーを使用する必要があります。典型的なケースは、たとえば XML ファイルからオンザフライでクラスを生成し、このクラスをリロードしようとするアプリケーションです。クラスがシステム クラスローダに入ると、それをアンロードして新しい定義を作成する方法はありません。

于 2009-02-12T08:42:24.933 に答える
32

クラスローダーの一般的な用途は、JAR を分離することです。プラグイン ( EclipseMaven 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 のインスタンスと互換性のない代入であることを意味します。これは、 に割り当てることができないと言う奇妙なことにつながる可能性があります。truecl1.equals(cl2)ClassCastExceptionsorg.project.Fooorg.project.Foo

離島と同じように、2 つのクラスはもう一方の存在を認識していません。異なる島で生まれ育ったクローン人間のことを考えてみてください。VM の観点からは、Class 型のインスタンスは他のオブジェクトと同様に処理されるため、問題はありません。複数存在する可能性があります。それらのいくつかが「同じ」であると考えていることは、VM にとって重要ではありません。

このパターンのもう 1 つの用途は、この方法でロードされたクラスを削除できることです。クラスローダからロードされたクラスから作成されたオブジェクトへのポインタを誰も持っていないことを確認してから、クラスローダのことも忘れてください。GCの次回の実行時に、このクラスローダによってロードされたすべてのクラスがメモリから削除されます。これにより、VM 全体を再起動することなく、アプリケーションを「リロード」できます。

于 2009-02-12T08:30:56.567 に答える
3

Java クラスローダーのもう 1 つの適切なリンク - Java クラスローダー

于 2009-04-17T06:58:22.547 に答える
2

委譲後のクラスローダーの使用について、私が過去に書いたいくつかのブログ:

于 2009-02-12T18:08:11.733 に答える
1

独自の ClassLoader を作成する必要があることは非常にまれです。また、必要に応じて、ClassLoader の機能を十分に理解している必要があります。

つまり、独自の ClassLoader を作成する必要がある理由を尋ねている場合は、作成する必要はありません ;)

そうは言っても、暗号化を扱うアプリケーション用に作成された ClassLoader も見てきました。このように、java.netSocket またはある種のファイル/ストリーム オブジェクトを作成するたびに、JVM バージョンを使用する代わりに、独自の特別なカスタム ビルド クラスを使用します。このようにして、すべての情報が暗号化され、開発者のエラーがないことを保証できました。

しかし、それはあまり一般的ではありません。独自のカスタム ClassLoader を作成する必要なく、Java のキャリア全体を進めることができます。実際、作成する必要がある場合は、本当に必要かどうかを確認する必要があります。

于 2009-02-12T05:50:10.743 に答える
0

開発者がカスタム クラス ローダーを作成するのはなぜですか? Bootstrap クラス ローダーを呼び出してカスタム クラスを呼び出さないのはなぜですか? カスタム クラス ローダーを定義する必要性は何ですか?

アプリケーションによっては、開発者は必要に応じてクラスのロード メカニズムをオーバーライドしたり、完全に置き換えたりする場合があります。

たとえば、クラスが LDAP からロードされる 1 つのアプリケーションを使用しました:S

他のアプリでは、独立したクラス管理が必要です (ホット デプロイをサポートするほとんどのアプリケーション サーバーと同様)。

リソースについては、Web には一覧にできないほどたくさんあります。

于 2009-02-12T05:29:35.130 に答える