クラスローダの研究ノートについて

 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