A、いくつかを含むJAVAクラスローダー?
スタートクラスローダ、ブートストラップクラスローダ
、クラスローダは、C ++言語で実装されてスタートクラスローダ独自のニーズのJVMの主要なクラスをロードするには、/ libにパス指定したパスの下のコアライブラリまたは-Xbootclasspathパラメータの下で責任がある仮想マシン自体の一部であり、ジャーパッケージは記憶、注意にロードされます:仮想マシンは、rt.jarのように、ファイル名の認識のjarパッケージによってロードされるので、ファイル名は、JARパッケージのlibディレクトリがアクションに投げ込まれていない場合でも、仮想マシンを認識されない場合(セキュリティ上の理由から、ブートストラップブートクラスローダがロードのみのパッケージ名のjava、javaxの、太陽などの初めにクラスのために)。
拡張クラスローダの拡張クラスローダ
これは、指定されたビットパス-Djava.ext.dirライブラリによってJAVA_HOME / libに/ extディレクトリまたはシステム変数をロードする責任があり、開発者は、標準的な直接拡張クラスローダーを使用することができます。
アプリケーションクラスローダアプリケーションクラスローダ
アプリケーションローダは達成するためにsun.misc.Launcher $ AppClassLoader日会社を意味します。これは、システム内のクラスライブラリをロードする責任があり、パスのjava -classpathまたは-Dのjava.class.pathを指定して、クラスパスであること、私たちは多くの場合、開発者を使用し、直接一般的にクラスにシステムクラスローダの負荷を使用することができますクラスローダのClassLoader#getSystemClassLoader()メソッドによって取得するプログラムのデフォルトのクラスローダがあります。
カスタムクラスローダjava.lang.classloder
カスタムクラスローダを継承java.lang.ClassLoaderのに必要です。
クラスローダとの関係
C ++、ノー親によって実装スタートクラスローダ、。
Java言語で実装クラスローダ(ExtClassLoader)を、展開し、親クラスローダがnullであります
システムクラスローダ(AppClassLoader)、Java言語で実装され、親クラスローダがExtClassLoaderです
カスタムクラスローダは、親クラスローダは確かAppClassLoaderです。
第二に、両親の委任メカニズム
親は親子関係モデルは、クラスの継承として知られていない任命することに注意してください。
その動作原理は次のとおりです。クラスローダの負荷がクラスが要求を受信した場合、それは、自分自身の負荷に行きませんが、実行するために、親クラスローダに要求を委託する親クラスローダが親であれば親クラスローダがこのアドオンタスクを完了できない場合は、親クラスローダは、成功したリターンにクラスのロードタスクを完了することができますならば、さらに再帰的な要求に続いて、アップ委譲クラスローダは、最終的には、サブをブートクラスローダの上部に到達しますローダーが自分をロードしようとする、これはそれぞれの息子は怠け者である、両親デリゲートモデルでは、あなたは私の父は、私はそれを行うことはできませんと言うまで、彼の父は、どうなる生きるために残されているたびに、私の息子の彼自身の方法であります完了します。
親はアクション/給付の仕組みを委任します
彼の父は、クラスをロードしたときに、クラスのロードを避けるためにオフこのレベルを繰り返すことにより、クラスローダは再びロード不要の子はありません。安全上の理由から、続いてのJava APIは、コアの種類を任意に置換されない定義されたネットワークを介してjava.lang.Integerのクラスという名前のパスを想定し、それがモードを委託して、ブートクラスローダの親に送信され、ブートクラスローダクラスの名前は、クラスがロードされたことがわかった、コアのJava APIで見つかった、と我々はコアAPIを防ぐことができますのでこと、Integer.classから直接ロード返し、java.lang.Integerの上を通過したネットワークをリロードしませんライブラリが改ざんされています。
要約:
メリット1、繰り返し負荷クラスを防ぐことができます
健康上の利点は、改ざんされたJavaコア・クラス・ライブラリAPIを防ぐことができます
シナリオ
Tomcatコンテナ、各WebAppのクラスパスの負荷経路CommonClassLoader負荷に委託Tomcatのジャーパッケージを運ぶイベントに基づいて、独自のクラスローダのWebAppとそれぞれ、。分離してパッケージ化します。また、オープンソースのフレームワークを成熟、独自のクラスローダを持っています。