Java Class ファイルを読む(4)
Java Class ファイルを読む(3) - アウトスタンディングなプログラマを目指しての続き。
constant_pool[13]
00000070 65 2e 6a 61 76 61 0c 00 04 00 05 01 00 04 42 61 |e.java........Ba| 00000080 73 65 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f |se...java/lang/O|
Baseという文字列を表す。
constant_pool[14]
00000080 73 65 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f |se...java/lang/O| 00000090 62 6a 65 63 74 00 21 00 02 00 03 00 00 00 00 00 |bject.!.........|
java/lang/Objectという文字列を表す。
access_flags
u2 access_flags;
00000090 62 6a 65 63 74 00 21 00 02 00 03 00 00 00 00 00 |bject.!.........|
クラスのアクセス権をあらわす。
0x0021のうち0x0001がpublicで宣言されていることを表す。0x0020は
>
invokespecial命令によって起動された場合,特別にスーパークラスのメソッドとして取り扱う。<
とあるが、昔のJava仮想マシンとの互換性を持つために新しいJavaコンパイラでは確実にフラグをたてるらしいので難しく考えなくてもとりあえずよさそうである。
this_class
u2 this_class;
00000090 62 6a 65 63 74 00 21 00 02 00 03 00 00 00 00 00 |bject.!.........|
constant_poolのインデックスであり、constant_pool[2]がこのクラスの情報を持つことを表す。constant_pool[2]はconstant_pool[13]をクラスの名前とするとしているのでBaseがこのクラスの名前であることになる。
super_class
u2 super_class;
00000090 62 6a 65 63 74 00 21 00 02 00 03 00 00 00 00 00 |bject.!.........|
constant_poolのインデックスであり、constant_pool[3]がこのクラスの親クラスの情報を持つことを表す。constant_pool[3]はconstant_pool[14]をクラスの名前とするとしているのでjava/lang/Objectがこのクラスの親クラスの名前であることになる。
interfaces_count
u2 interfaces_count;
00000090 62 6a 65 63 74 00 21 00 02 00 03 00 00 00 00 00 |bject.!.........|
実装したinterfaceがいくつなのかを表す。
interfaces
u2 interfaces[interfaces_count];
実装したinterfaceの情報を指すインデックスが並ぶはずだが、ここではinterfaces_countが0なので空。
fields_count
u2 fields_count;
00000090 62 6a 65 63 74 00 21 00 02 00 03 00 00 00 00 00 |bject.!.........|
クラスが持つフィールド(クラス変数, インスタンス変数)の数を表す。
fields
field_info fields[fields_count];
フィールドの情報が並ぶはずだが、ここではfields_countが0なので空。