この記事では、Java のクラスロード機構の手順を紹介します。詳細は以下を参照してください。
クラスロードメカニズム
クラスが仮想マシンのメモリにロードされてから、メモリからアンロードされるまでライフサイクルには、ロード、検証、準備、解決、初期化、使用、アンロードの 7 つの段階が含まれます。検証、準備、解析の 3 つの部分を総称して「リンク」と呼びます。これら 7 つの段階のシーケンスを次の図に示します。
アクティブな参照: クラスがアクティブに参照された後、初期化プロセスがトリガーされます (読み込み、検証、準備をその前に開始する必要があります)
1) 新しい getstatic が発生した場合、putstatic、または invokestatic の 4 つのバイトコード命令を使用する場合、クラスが初期化されていない場合は、最初に初期化をトリガーする必要があります。これら 4 つの命令を生成する最も一般的な Java コード シナリオは次のとおりです。 new キーワードを使用してオブジェクトをインスタンス化するとき、クラスの静的フィールドを読み取りまたは設定するとき (final によって変更され、によって定数プールに入れられた静的フィールドを除く)コンパイラ))、クラスの静的メソッドを呼び出すとき。 2) java.lang.reflect パッケージのメソッドを使用してクラスへのリフレクション呼び出しを行う場合、クラスが初期化されていない場合は、最初にその初期化をトリガーする必要があります。
3) クラスを初期化するときに、その親クラスが初期化されていないことが判明した場合は、親クラスの初期化をトリガーする必要があります。
4) 仮想マシンが起動するとき、ユーザーは実行するメイン クラス (main() メソッドを含むクラス) を指定する必要があり、仮想マシンは最初にこのクラスを初期化します。
5) jdk7 の動的言語サポートを使用する場合、java.lang.invoke.MethodHandle インスタンスの最終解析結果が REF_getStatic、REF_putStatic、REF_invokeStatic のメソッド ハンドル、およびこのメソッドに対応するクラスの場合ハンドルが初期化されていません。最初にトリガーの初期化が必要です。
受動参照: クラスが受動参照の場合、クラスは初期化プロセスをトリガーしません。
1) サブクラスを介して親クラスの静的フィールドを参照しても、サブクラスは発生しません。初期化されます。静的フィールドの場合、フィールドを直接定義するクラスのみが初期化されるため、親クラスで定義された静的フィールドをサブクラス経由で参照すると、親クラスの初期化のみがトリガーされ、サブクラスの初期化はトリガーされません。 。
2) 配列定義を通じてクラスを参照しても、このクラスの初期化はトリガーされません。
3) 定数は、コンパイル フェーズ中に呼び出し側クラスの定数プールに保存されます。本質的に、定数は定数を定義するクラスを直接参照するわけではないため、定数を定義するクラスの初期化は行われません。トリガーされません。
以上がJavaクラスロードメカニズムとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。