1)クラスのロード処理がどのようにのようなものでしょうか?
①ロード:特定のニーズに応じて、適切なローダ制御バイト・ストリームを取得する(ブートストラップクラスローダを直接取得できない、拡張クラスローダ、システム、カスタム)を選択し、クラスオブジェクトは、データ・アクセス・エントリとしてインスタンス化されます。
接続(検証、準備、分析):( JVM)②
A.検証、ロード・フェーズ中にソースがバイトストリームによって保証されていないが、純粋なJavaコードがオーバーコンパイルされている、ファイルに、ネットワーク上の他の人をもダウンロードすることができ、ジップバッグなど、そう確認する(検証ファイル形式、メタデータの検証、バイトコード検証、シンボリック参照の検証)
。調製B、
定数プールを解析cが直接参照;.署名するための参照を置換する
一度だけ実行されるJavaコードの実際の実装:③初期化。ここでは、クラスのコンストラクタで、指定された初期値は、静的変数に代入します。(注:この時点で、準備フェーズに異なるクラス変数を設定する上記初期値);
2)は、2つの異なるクラスローダーがどのように区別し分離するために、同じクラスをロード?
両親デリゲートメカニズム
はloadClassクラスローダ()メソッド観測:
{<?>パブリッククラスのloadClass(文字列名)は、ClassNotFoundExceptionがスローされます
(falseに、名前)のloadClassを返しますが、
}
にloadClass同期クラス(文字列名、ブール決意を)保護<?>
スローにClassNotFoundException
{
クラスC = findLoadedClass(名);
もし(C == NULL){
{試みる
場合(親= nullを!){
C = parent.loadClass(名前、偽の);
}他{
C = findBootstrapClassOrNull(名);
}
}キャッチ(ClassNotFoundExceptionが電子){
}
IF(C == NULL){
C =にfindClass(名);
}
}
(解決){もし
resolveClass(C);
}
Cを返します。
}
ドロー:リクエストがクラスをロードするときは、判決がロードされていないされた後、最初のチェックは、以前にロードされている、親クラスローダに委託タスクを完了するために最初のロード、タスクをロードするので、すべてのロード要求は、ブートクラスローダに送られるべきですこれらのうち、唯一の親ローダは、このタスクの負荷が例外をスローが、唯一自分自身をロードするために完了することはできません。
それぞれの荷重との関係を組み合わせているため、それぞれの分割、クラスローダ負荷の異なるインスタンスがあると、それは、処理領域内に2つの異なるクラスを有して互いに見えない、と異なるスタックを生成しますClassインスタンス。委譲要求時には、各レベルは、レベル約束を達成するために、クラスローダの操作の上でなければなりません。
それが保証されるので、異なるクラスローダロードされたオブジェクト・クラス内の同じ名前が異なるタイプのものであり、変換が互いに挟んで互換性がないことができます。クラスのうちの異なるオブジェクトをロードするクラスローダの同じタイプは、同じクラスではありません。区別と分離効果を達成するために。
クラスローダの研究ノートについて
おすすめ
転載: www.cnblogs.com/1693977889zz/p/11279837.html
おすすめ
ランキング