メソッドの解析に対応。相変わらず属性は未サポートですが・・・。
現在の読み込み対応データ
★付きが今日対応したモノ。
クラスデータ
| 名称 | サイズ(byte) | 説明 |
|---|---|---|
| magic | 4byte | クラスファイルを識別するためのマジックナンバー。0xCAFEBABEが入る。 |
| minor_version | 2byte | クラスのマイナーバージョン |
| major_version | 2byte | クラスのメジャーバージョン |
| constant_pool_count | 2byte | constant_pool (クラス名メソッド名などの定数が格納されるテーブル)の数 |
| constant_pool | 可変 | クラス名メソッド名などの定数が格納されるテーブル。constant_pool_count-1個のconstant_poolが並ぶ。「文字列」や「Class情報」など種類がいくつかあって、それぞれデータ形式/サイズが異なる。 |
| access_flags | 2byte | クラス/インターフェイスのアクセス権限情報 |
| this_class | 2byte | このクラスファイルで定義されているクラスを示すconstant_poolのid。 |
| super_class | 2byte | このクラスファイルで定義されているクラスの親クラスを示すconstant_poolのid。 |
| interfaces_count | 2byte | 実装しているインターフェイスの数。 |
| interfaces | 可変(2byte*interfaces_count) | 実装しているインターフェイスを示すconstant_poolのid。interfaces_count数だけ続く。 |
| fields_count | 2byte | クラス/インターフェイスで定義されているフィールドの数。 |
| field_info | 可変 | クラス/インターフェイスで定義されているフィールド。データ形式は「フィールドデータ」を参照。fields_count数だけ続く。 |
| ★methods_count | 2byte | クラス/インターフェイスで定義されているメソッドの数。 |
| ★method_info | 可変 | クラス/インターフェイスで定義されているメソッド。データ形式は「メソッドデータ」を参照。methods_count数だけ続く。 |
フィールドデータ
| 名称 | サイズ(byte) | 説明 |
|---|---|---|
| access_flags | 2byte | フィールドのアクセス権限情報 |
| name_index | 2byte | フィールド名を示すconstant_poolのid |
| descriptor_index | 2byte | フィールドの型の文字列表現を示すconstant_poolのid |
| attributes_count | 2byte | フィールドに付加された属性の数 |
| attribute_info | 可変 | フィールドの属性。定数の値やdeplicatedの情報なんかが属性として指定されるらしい。attributes_count数だけ続く |
メソッドデータ
| 名称 | サイズ(byte) | 説明 |
|---|---|---|
| ★access_flags | 2byte | メソッドのアクセス権限情報 |
| ★name_index | 2byte | メソッド名を示すconstant_poolのid |
| ★descriptor_index | 2byte | メソッドの引数と戻り値の型の文字列表現を示すconstant_poolのid。「(<引き数の型><引き数の型>..)<戻り値の型>」形式。 |
| attributes_count | 2byte | メソッドに付加された属性の数 |
| attribute_info | 可変 | メソッドの属性。メソッドの処理コード、発生する例外などが属性として指定される。attributes_count数だけ続く |
メソッドのレイアウトはフィールドと一緒。access_flagsの値やdescriptorの書式がちょい違う。あと、ちゃんと調べてないけど所持する属性も違うらしい。
ここまでの解析コード
動作サンプル
open( "./Kitten.class", "r+b" ) {|io| jc = Java::JavaClass.new io puts jc.to_s } puts "" open( "./HelloWorld.class", "r+b" ) {|io| jc = Java::JavaClass.new io puts jc.to_s }
実行結果です。
// version 49.0
public super class com.example.Kitten
extends java.lang.Object
implements java.io.Serializable {
private java.lang.String name;
private int age;
public void <init> ( ) {};
public void <init> ( java.lang.String arg1, int arg2 ) {};
public java.lang.String getName ( ) {};
public void setName ( java.lang.String arg1 ) {};
public int getAge ( ) {};
public void setAge ( int arg1 ) {};
public void meow ( ) {};
}
// version 49.0
public super class HelloWorld
extends java.lang.Object {
public void <init> ( ) {};
public static void main ( java.lang.String[] arg1 ) {};
}