Javaクラスローディング機構 - クラスローディングプロセス(バリデーション)

Java仮想マシンの負荷クラスの全体のプロセスは、次のとおりです。ロード、検証、準備、解像度、初期化を接続プロセスを解決するために呼び出さ検証、準備、。今日は、検証について話しています。
最初のステップは、接続フェーズを確認することです、この段階の目的は、クラスに含まれる情報のバイトストリームファイルは、現在の仮想マシンの要件を満たしていることを確認することで、仮想マシンは自分自身の安全を危険にさらすことはありません。
純粋なJavaコードを使用して、(C / C ++に対して)比較的安全Java言語は、そのような配列の範囲外のデータにアクセスするよう作用し、いくつかを行うことができない、それを入力する遷移の種類が存在していないコードへのジャンプを達成しません(通常はコンパイラエラーが言われているこのさ?)事の行のソートは、あなたがこれを行う場合、コンパイラはコンパイルを拒否します。しかし、私は必ずしもソースコードからコンパイルされたJavaを必要としないクラスの文書は、あなたも直接進コンパイラのクラスファイルの作成を含め、生産するためにどのような方法を使用することができ、前に言いました。したがって、上記のJavaコードを使用すると、他の手段によって、クラスファイルを生成するために行うことができますことを行うことはできません。仮想マシンは、着信バイトストリームをチェックし、バイトストリームが有害でロードおそらくので、システムがクラッシュすることはありません場合。したがって、検証は自分自身の保護のための仮想マシンが重要な仕事です。
厳格な検証段階かどうかは、直接Java仮想マシンが実行パフォーマンスの観点から言えば、悪意のあるコードの攻撃に耐えることができ決定し、クラスの仮想マシンの負荷サブシステム内のワークロードの検証フェーズは、その大部分を占めています。
検証ファイル形式、メタデータの検証、バイトコード検証、シンボリック参照の検証:全体として、検証フェーズは、実質的にいくつかのタスクを完了します。

  1. ファイル形式の検証それは、マジック0xCAFEBABEで始まるマイナーバージョン番号\マスターが一定のタイプは定数、定数プールでサポートされていないがある場合、削除することがあれば、様々な部品およびドキュメントクラスファイル自体、現在の仮想マシンの処理範囲内にあるメインを確認しますまたはその他の追加情報。要するに、ステージ主な目的は、入力バイトストリームが解析され、Java形式の情報の種類の要件に沿って説明した正しい面積法、に格納することができることを保証することですこの段階は、バイナリバイトストリームに基づいて行われ、そしてのみバイトストリームの方法のこの段階によって検証した後、記憶のためにメモリの領域に入る確認し、検証の3つの相全て基づいている方法後方領域ストレージ構造、および直接バイトストリームを動作しません。
  2. メタデータの検証バイトコード記述情報は、この段階としては、Java言語仕様を記述する情報の遵守を確保することが、本意味分析フェーズである:クラスはjava.lang.Objectのを除いて(親クラスを持っているかどうかを、他のすべてのクラスがあるべきです親)がある。このクラスの継承の親が継承クラス(変性最終クラス)を許可していないかどうか、クラスが抽象クラスでない場合は、その親クラスまたはインタフェースの実装要件のすべてのメソッドを実装するかどうか、クラスフィールドかどうか、親クラスとメソッドの競合。このフェーズの主な目的は、メタデータ情報は、Java言語仕様が存在しません満たしていないことを確認するために、メタデータ情報などの意味的検証を得ることです
  3. バイトコード検証これは、全体の検証プロセスは、最も複雑な段階である、主な目的は、プログラムのセマンティクスを決定するために、データ・フローと制御フロー解析論理、正当なものです。メソッド本体の分析を検証します。この段階で行われ、データ型メタデータ情報確認後の第二段階では害仮想マシンのセキュリティをすることはありません実行時にメソッドのバリデーションクラスを確保するために、イベント。たとえば、次のように命令のコード配列とオペランドスタックのデータ型が一緒に仕事ができることを確実にするために、スタックint型を置くために動作が類似表示されていない、長いローカル変数テーブルでロードすることがShique使用、ジャンプ命令は、ジャンプすることを保証するものではありません。メソッド本体以外のバイトコード命令に、保証方法ボディ型変換も、子クラス・オブジェクト・データ・タイプに割り当てる、例えば、セキュリティの親クラスが、サブクラスに割り当てられた親クラスのデータ有効です彼に何の接触を与えられていないオブジェクトのデータ・タイプの割り当て、それは危険で違法です。
  4. シンボリック参照の検証場合シンボル参照最終段チェックが直接参照に、仮想マシンで発生し、接続の第3段階における変換動作-分析フェーズが生じます。符号検証情報は、照合の自分以外のクラス(定数プール基準シンボル)と見なすことができ、確認する必要があります参照して説明記号列の完全修飾名は、対応するクラスを検索するかどうか、でアクセスシンボリック参照クラス、フィールド、メソッド(プライベート、保護、公共、デフォルト;単純名指定されたクラス記述フィールド記述子とフィールドとメソッドの遵守方法があるかどうか ) 現在のクラスにアクセスできるかどうかを。目的は、適切に実行することができるシンボリック参照の分析動作の検証を確実にすることです。

おすすめ

転載: blog.csdn.net/huqianlei/article/details/90734971