Classファイル構造とバイトコード

3509 ワード

Classファイル構造
classファイルは8ビットバイトのバイナリストリームファイルで、各データ項目は順番に前後に緊密に並べられ、隣接する項目の間に隙間がなく、classファイルを非常にコンパクトにすることができ、体積が軽く、JVMによってメモリに迅速にロードされ、少ないメモリ空間を占めることができる.私たちのJavaソースファイルは、コンパイルされた後、各クラス(またはインタフェース)が単独でclassファイルを占有し、クラス内のすべての情報はclassファイルに対応する記述があります.classファイルは柔軟であるため、Javaソースファイルよりも強い記述能力を持っています.
マジック数、claaファイルバージョン
マジックはCAFEBABEで、classファイルバージョンはバイトコードバージョンを表し、低バージョンJVMが高バージョンコードを実行することを防止します.
定数プール
定数プールの数は一定ではないため、定数プール入口にu 2(すなわち2バイト)タイプのデータを配置する必要があり、定数プール容量カウント値(constant-pool-count)を表す(1から0は定数を参照しないことを示す).定数プールには主に2種類の定数:字面量(Literal)とシンボル参照(Synbolic Reference)が格納される.定数プールはclassファイルで最もスペースがかかります.
定数プール項目cp_infoのデータ構造は以下の通りです.
cp_info{
	u1 tag;
	...
}


たとえば
CONSTANT_Long_info{
	u1 tag=5;
	u4 high_bytes;
	u4 low_bytes;
}

CONSTANT_utf8_info{
    u1 tag=1;
    u2 length;
    u1 byte[length];
}

その中のtagが次の表のフラグです.
を選択します.
ひょうしき
説明
CONSTANT_utf8_info
1
UTF-8符号化文字列(文字列)
CONSTANT_Integer_info
3
int整形字面量(字面)
CONSTANT_Float_info
4
float浮動小数点型字面量(字面)
CONSTANT_Long_info

longロング整数字面量(字面)
CONSTANT_Double_info

doubleデュアル精度浮動小数点型字面量(字面)
CONSTANT_Class_info

クラスまたはインタフェースのフルネーム(参照)
CONSTANT_String_info

Stringタイプの定数オブジェクト(参照)
CONSTANT_Fieldref_info

クラス内のフィールド(参照)
CONSTANT_Methodref_info
10
クラス内のメソッド(参照)
CONSTANT_InterfaceMethodref_info
11
クラスが実装するインタフェースメソッド(参照)
CONSTANT_NameAndType_info
12
フィールドとメソッドの名前とタイプ(参照)
CONSTANT_MethodHandle_info
15
表示方法ハンドル(参照)
CONSTANT_MothodType_info
16
フラグメソッドタイプ(参照)
CONSTANT_InvokeDynamic_info
18
動的メソッド呼び出しポイントを表す(参照)
上のすべてのタグが参照され、最終的には具体的な内容が1つのタグが字面のcp_に参照されます.infoは具体的な情報を格納します.
CONSTANT_String_info{
    u1 tag = 8;
    u2 String_index;//    CONSTANT_utf8_info   
}

具体的にはhttps://blog.csdn.net/wangtaomtk/article/details/52267548
アクセスフラグ
2バイトしかありません.クラスがabstract、final、public、インタフェースであるかどうかなどを示します.
クラスインデックス
U 2タイプ、CONSTANTを指すClass_infoタイプの定数で、本クラスの全制限名を記録します.
親インデックス
U 2タイプ、CONSTANTを指すClass_infoタイプの定数で、親クラスの全限定名を記録します.
インタフェースインデックスセット
次に、不定長のバイトは、クラスが実装するインタフェースを表す.上と似ています.
フィールドテーブルセット
1つのフィールドは1つのフィールドテーブルで表され、フィールドの集合はもちろんフィールドテーブルの集合で表されます.
を選択します.
名前
数量
u2
access_flags
1
u2
name_index
1
u2
descriptor_index
1
u2
attributes_count
1
attribute_info
attributes
attributes_count
access_flagsの役割はクラスのアクセスフラグの役割と似ています.name_indexはこのフィールドのインデックスで、定数プールのCONSTANT_を指します.NameAndType_infoタイプ.descriptor_indexは、フィールドのデータ型attributes_を記述するために使用されます.countプロパティテーブル長(必須ではない)attributesプロパティテーブル(必須ではない)
メソッドテーブルセット
メソッドテーブルの構成はフィールドテーブルと同じです.ただ、descriptor_indexには、フィールドのデータ型、パラメータリスト、戻り値も含まれます.また、属性テーブルにはソースコードを格納するためのcodeプロジェクトがあります.本classが親クラスを書き換えていない場合、javaは親クラスのメソッドを子クラスのメソッドテーブルにコピーするほど愚かではありません.javaクラスコンパイルによって生成された.classファイルにはメソッドのパラメータ名が含まれていますが、インタフェースクラスコンパイルによって生成されたメソッドには形式パラメータ名は含まれていません.
バイトコード
各バイトコードコマンドには、独自のアシストがあります.(アセンブリ言語と同じ).アシストの最初のアルファベットは、自分が操作したデータ型を表します.バイトコード設計は公有設計と私有実現の原則に従う.すべてのJVMは一貫したバイトコード仕様に従っていますが、内部実装は異なります.
ロードとストレージ命令
えんざんめいれい
タイプ変換命令
オブジェクト作成とアクセス命令
JVMの配列は比較的特殊な問題である.だから配列を作成して、要素を配列に格納して、配列の長さを取って、すべて自分の命令があります
せいぎょてんいめいれい
メソッド呼び出しと戻り命令
例外処理命令
どうきめいれい
monitorenterとmonitorexit.(スタックトップ要素をロックとして同期)