「クラスのロード フェーズでは、主に次の 3 つのことを完了します。」
"のメソッド完全なクラス名によるクラスのバイナリ ストリームの取得はさまざまです。「
「リンクのこの段階は、主に検証、準備、分析の 3 つの部分に分かれています。」
「検証フェーズの主な目的は、クラス ファイルの形式が正しく、実行時に仮想マシンのセキュリティが危険にさらされないことを確認してください。"
検証フェーズには多くのルールがありますが、大きく分けて次の 4 つがあります。ステージ「具体的な内容については、詳しくは説明しません。「Java仮想マシンを深く理解する」を参照してください。この記事は、概要を作成し、全体的なプロセスを把握することを目的としています。詳細については説明せずに、クラスのロードについて説明します。"
「準備フェーズでは主にクラスの静的変数にメモリを割り当て、それらをデフォルト値に初期化します。」
一般的なデータ型のデフォルト値は次のとおりです
データ型 | デフォルト値 |
---|---|
バイト | (バイト)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
ブール値 | false |
char | '\u0000' |
参照 | null |
「クラス静的変数のフィールド属性テーブルに ConstantValue 属性が存在する場合、代入ステートメントは直接実行されます。」
では、どのような状況でフィールドが実行されるのかクラスの静的変数の属性テーブルは存在しますか? ConstantValue プロパティはどうですか?
クラス ファイルのバイトコードを簡単に表示するために、IDEA にプラグイン jclasslib バイトコード ビューアをダウンロードしました。これは非常に便利です。 。次のコードを使用して、バイトコードの形式で検証します
public class Person { private static int age = 10; private static final int length = 160; private static final String name = "name"; private static final String loc = new String("loc"); }
「したがって、長さと名前の属性には、準備段階で ConstantValue で指定された値が割り当てられます」
「それでは、age 属性と loc 属性はどの段階で割り当てられるのでしょうか? それは初期化段階であり、後で詳しく説明します。」
「クラス、インターフェイス、フィールドの (定数プール内の) シンボリック参照を変換する」およびメソッドを直接参照に追加します。" シンボリック参照: 一連のシンボルを使用して、参照されるターゲットを説明します。 直接参照; ターゲットへの直接ポインタ
参加して次のようなクラスを作成してください
public class Student { private String name; private int age; public String getName() { return this.name; } }
フィールドを例にとると、名前と年齢に対応するオブジェクトは直接ポイントしません。メモリ アドレスの代わりに、文字列を使用して記述します (つまり、シンボリック参照)。解析段階では、これらの記述をターゲットを直接指すポインター (つまり、直接参照) に変換します。
「执行类静态成员变量赋值语句和静态代码块中的语句」
我们把上面的Student代码改成如下形式
public class Student { private String name; private int age = 10; private static int gender = 1; { System.out.println("构造代码块"); } static { System.out.println("静态代码块"); } public Student() { System.out.println("构造函数"); } public String getName() { return this.name; } }
可以看到字节码中包含了3个方法,getName方法我们知道,7e51f00a783d7eb8f68358439dee7daf和583d030be372af71281df966e84181a5方法里面执行了哪些逻辑?从字节码的角度分析一波
「7e51f00a783d7eb8f68358439dee7daf方法」
从字节码可以看到7e51f00a783d7eb8f68358439dee7daf方法的主要逻辑为
「583d030be372af71281df966e84181a5方法」从字节码可以看到583d030be372af71281df966e84181a5方法的主要逻辑为
# #「面接の質問によっては、静的コード ブロック、構築コード ブロック、コンストラクターの実行順序についてよく尋ねられるため、583d030be372af71281df966e84181a5 メソッドと 7e51f00a783d7eb8f68358439dee7daf メソッドの役割を理解することが依然として必要です。」
ここで結論を直接要約します。デモを書いて検証することができます##「継承なしの実行シーケンス」##静的コード ブロックと静的メンバー変数、実行順序は書き込み順序によって決まります (一度だけ実行されます)
#親クラス static (静的コード ブロック、静的メンバー変数)、サブクラスの static (静的コード ブロック、静的メンバー変数) (1 回のみ実行されます)
メソッド領域に型データのリサイクル条件が設定されていることがわかります。比較的厳密ですが、その影響は最小限であるため、一部のガベージ コレクターはメソッド領域の型データをリサイクルしません
変数代入処理
##
以上がインタビュアー: クラスロードプロセスについて教えてください (10 個の図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。