質問

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

  • 開発者はなぜカスタム クラス ローダーを作成するのに、ブートストラップ クラス ローダーを呼び出してカスタム クラスを呼び出さないのですか?カスタム クラス ローダーを定義する必要があるのは何ですか?
  • クラスローダーにはなぜこれほど多くの種類があるのでしょうか?例えば:Bootsrap、Comman、Catalina クラスローダーなど、

    前もって感謝します。

役に立ちましたか?

解決

見、有効な理由を作成したclassloader:

  1. したいクラスをロードからの非伝統的なソース(例えば、bytecode一つのクラスが格納される、データベースのネットワーク 行として0、1秒間によるpidgeons -MessengerPidgeonClassLoader).あるクラスローダの実装では、APIのような場合など URLClassLoader.

  2. に定義する必要があり異なる階層への負荷ます。デフォルトの実装のクラスローダに委譲の検索の最初の、そして負荷のクラスです。も多いは上位の階層となります。そのためOSGIやEclipseしたclassloaderとしてのマニフェストの作成が行えます。MFファイルを定義すべての種類の奇妙な階層のパス(バディ-classloadingがあります。すべてのEclipseたclassloaderを実施BundleClassLoader ータとして追加のコードを探資源内でのEclipseのPlugins.

  3. だけど一部変更にbytecode.(粉を山にして真ん中をbytecodeは暗号化されまunencryptでのインタフェースをないということは、本当は、もって).したい"パッチ"の授業に読み込まれたインタフェースをラJDO bytecode促進)

異なるクラスローダのシステムクラスローダが必要な場合に必要なアンロードからクラスメモリ、または負荷の授業以来の定義を行います。典型的な場合は申請を生成するクラスのXMLファイルから、例えば、それをリロードはこのクラスです。一回のクラスは、システムクラスローダがなく荷役しなければならないというので、新しい定義で設定します。

他のヒント

クラスローダーの一般的な使用法は、JAR を分離することです。プラグインを使用するアプリケーションがある場合 (日食, メイブン 2)、次のような状況が発生する可能性があります。プラグイン X にはバージョン 1.0 の jar A が必要ですが、プラグイン Y にはバージョン 2.0 の同じ jar が必要です。ただし、X はバージョン 2.0 では実行できません。

クラスローダーがある場合は、クラスのパーティションを作成できます (薄いブリッジで接続された孤立した島を想像してください。ブリッジはクラスローダーです)。このようにして、クラスローダーは各プラグインが何を参照できるかを制御できます。

プラグイン X が静的フィールドを持つクラス Foo をインスタンス化する場合、これは問題なく、各クラスローダーが実際にクラス Foo の独自のインスタンスを作成するため、プラグイン Y の「同じ」クラスとの混同は起こりません。これで、メモリ内に 2 つのクラスができます。 cl1.getName().equals(cl2.getName())true しかし cl1.equals(cl2) ではありません。これは、cl1 のインスタンスが cl2 のインスタンスと割り当て互換性がないことを意味します。これは奇妙なことを引き起こす可能性があります ClassCastExceptions それを言うのは org.project.Foo に割り当てることはできません org.project.Foo.

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

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

カップルブログの立ちたいと思っていまに深く過去に利用後の委譲のたclassloader:

このような場合、生のソースを無視することはできません。もし、あんたが 本当に 内側のドープが欲しい、 ハードコア, 、 読む Java 仮想マシン仕様の関連部分.

Javaのクラスローダーのための

もう一つの良いリンク - のJavaクラスローダする

それはあなたがあなた自身のクラスローダを作成する必要があることは極めてまれです。あなたがする必要がある場合やgenereally、あなたはすでにクラスローダが何をするかの本当に良い理解している必要があります。

言い換えれば、あなたは、あなたが1を作成する必要はありません、独自のクラスローダを作成する必要がありますなぜあなたが求めている場合;)

言われていること、私はまた、暗号化に対処アプリケーション用に作成されたClassLoaderを見てきました。この方法では、すべての時間があなたはそれが自分自身の特別なカスタム構築されたクラスを使用する代わりに、JVMのバージョンを使用しての、java.netSocketまたはファイル/ストリームオブジェクトのいくつかの種類を作成します。このように、彼らはすべての情報が暗号化されたことと全く開発者のエラーがなかったことを保証することができます。

しかし、それは非常に一般的ではありません。あなたは今まで、独自のカスタムクラスローダを作成しなくても、全体のJavaのキャリアを行くことができます。あなたは1を作成する必要がある場合は、それが必要かどう実は、あなたが本当に求める必要があります。

  

なぜ開発者は、カスタムクラスローダーを書くのですか、なぜあなたのカスタムクラスを呼び出すためにブートストラップクラスローダを起動していませんか?カスタムクラスローダーを定義する必要は何ですか?

アプリケーションに応じて、開発者がオーバーライドしたり、完全に自分のニーズに合わせて、クラスローディング機構を交換することがあります。

S

たとえば、私は、そのクラスLDAPからロードされた1つのアプリケーションを使用していました

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

リソースについて、単に表示されないことを、ウェブでは、トンがあります。

例:

Tomcatは異なるWebアプリケーションからクラス/ jarファイルをロードし、単離するためにカスタマイズされWebAppClassloaderを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top