読者です 読者をやめる 読者になる 読者になる

Java Class ファイルを読む(4)

java

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なので空。