まず、
スローガンがある場合は、Javaで生まれ:「実行どこでも、一度は!」この部分の機能をバイトコード。
注:JVMとクラスは、この特定のバイナリファイル形式に関連付けられているファイルのみをJavaバインディングを含む任意の言語を、含まれていません。
他の言語は、コンパイラによってバイトコードを生成し、その後、上記のJVMを実行することができます。
二、クラスファイル
任意に一つだけのクラスまたはインタフェース定義情報クラスファイル対応しているが、ノーを言う権利を回すインチ
クラス・ファイルは、各データ項目に基づいて、バイト単位で8ビットのバイナリストリームのセットは、任意の増加中間区切り文字なしで、別のクラスファイルに厳密に従ってコンパクトに配置されています。
:クラスファイルフォーマットは、この擬似データ構造が2種類のみであるC言語のダミーデータ格納構造と同様の構造を使用して符号なしとテーブル
基本データ型に属し、符号なし、U1、U2、U4に、U8は1-8バイトの符号なしの数値を表します。
複数のテーブルは、符号なしの数またはテーブルデータ項目の設定など、他の複雑なデータ型です。
クラスファイル全体は、それが最後に「_info」に通例である、基本的にテーブルです。
ClassFile {
u4 magic; //Class 文件的标志
u2 minor_version;//Class 的小版本号
u2 major_version;//Class 的大版本号
u2 constant_pool_count;//常量池的数量
cp_info constant_pool[constant_pool_count-1];//常量池
u2 access_flags;//Class 的访问标记
u2 this_class;//当前类
u2 super_class;//父类
u2 interfaces_count;//接口
u2 interfaces[interfaces_count];//一个类可以实现多个接口
u2 fields_count;//Class 文件的字段属性
field_info fields[fields_count];//一个类会可以有个字段
u2 methods_count;//Class 文件的方法数量
method_info methods[methods_count];//一个类可以有个多个方法
u2 attributes_count;//此类的属性表中的属性数
attribute_info attributes[attributes_count];//属性表集合
}
1、魔数
u4 magic; //Class 文件的标志
0xCAFBBABE:各クラス4バイトのファイルの前にクラスファイルを特定する記号であるマジックナンバー、最初の4バイトと呼ばれます。
2、クラスバージョン
u2 minor_version;//Class 的次版本号
u2 major_version;//Class 的主版本号
バージョン番号が続き、4バイト、バイトのマイナーバージョン番号5,6、7,8バイトメジャーバージョン番号です。
JDK1.1、1度にした後、45(主要バージョン)から始まるJavaのバージョン番号。
(JDK1.0 - JDK1.1使用45.0から45.3) - 45.65535、JDK1.1は45.0をサポートすることができます
JDK1.2は45.0をサポート - 46.65535。下位互換性のあるJDK。
3、定数プール
u2 constant_pool_count;//常量池的数量
cp_info constant_pool[constant_pool_count-1];//常量池
メジャーおよびマイナーバージョン番号は、定数プールの数はconstant_pool_count-1定数プールされる直後(定数プールカウンタは、第一の定を空にし、1からカウントを開始0特別な配慮であり、インデックス値0」を表します定数プールは、「任意の項目を参照していません)。
定数プールは、クラスファイルリソース倉庫として理解することができ、それは他のプロジェクトに関連付けられたデータファイル構造の最大の種類です。
:メインの定数プールは、2つの定数保存リテラルとシンボル参照を。そのようなテキスト文字列として比較的近いJava言語レベルの概念にリテラル定数は、最終的というように一定の値として宣言しました。シンボリック参照所属コンパイルの原則側面の概念。クラスとインタフェースの完全修飾名、名前と記述子、メソッド名と記述子フィールド:以下の3つの定数を備えます。
:各々が定数プールテーブル内の定数であり、14個のテーブルは、共通の特性有する第一のタイプの開始定数は、この定数の現在の部分を表す定数の種類を識別するためにU1フラグ-tagありますタイプ。
タイプ | マーク(タグ) | 説明 |
---|---|---|
CONSTANT_utf8_info | 1 | UTF-8エンコードされた文字列 |
CONSTANT_Integer_info | 3 | プラスチックリテラル |
CONSTANT_Float_info | 4 | フロートリテラル |
CONSTANT_Long_info | 5 | 長整数リテラル |
CONSTANT_Double_info | 6 | 倍精度浮動小数点リテラル |
CONSTANT_Class_info | 7 | リファレンスシンボルクラスまたはインタフェース |
CONSTANT_String_info | 8 | タイプ文字列リテラル |
CONSTANT_Fieldref_info | 9 | シンボルフィールドへの参照 |
CONSTANT_Methodref_info | 10 | リファレンスシンボルクラスメソッド |
CONSTANT_InterfaceMethodref_info | 11 | インタフェース基準シンボルの方法 |
CONSTANT_NameAndType_info | 12 | 符号フィールドやメソッド |
CONSTANT_MothodType_info | 16 | 記号の種類の方法 |
CONSTANT_MethodHandle_info | 15 | 表現ハンドル |
CONSTANT_InvokeDynamic_info | 18 | これは、動的メソッド呼び出しポイントを表します |
4、アクセスフラグ
それがクラスである場合、クラスは、それがパブリックまたは抽象型であるかどうか、クラスまたはインタフェースである:2つのバイトが続く定数プールは、アクセスフラグを表し、このフラグは、クラスまたはインタフェースレベルのアクセス情報の一部を識別するために使用される、などの終了後言葉はfinalとして宣言などされています。
5、クラスインデックス、インデックスと親インデックスは、インターフェイスを設定します
u2 this_class;//当前类
u2 super_class;//父类
u2 interfaces_count;//接口
u2 interfaces[interfaces_count];//一个雷可以实现多个接口
クラスインデックスは、インデックスは、親クラスU2のデータ型であり、インタフェースはインデックス型U2のコレクションです、
クラスと親クラスインデックスCONSTANT_Class_info定数の型記述子への各インデックスポイントは、完全修飾クラス名のStringクラスの定数のインデックス値で見つけることができます。
クラスインデックスは、このクラスの親クラスの完全修飾名を決定するために使用されるクラス、親クラスインデックスの完全修飾名を決定するために使用されるインデックスがに加えて、唯一の親であるように、Java言語、単一継承、ため java.lang.Object
、外のすべてのJavaクラスこれに加えて、親クラスを持って java.lang.Object
外に、すべてのJavaクラスの親インデックスはゼロとは異なります。
インターフェースインデックスセットは、これらのインタフェースは、これらのインターフェイスが実装され、このクラスの実装を記述するために使用されているimplents
(クラスがインタフェース自体である場合、それはextends
インターフェースインデックスセット内の左から右へ順番後)インタフェースを。
図6に示すように、テーブルのフィールドのセット
u2 fields_count;//Class 文件的字段的个数
field_info fields[fields_count];//一个类会可以有个字段
フィールドテーブル:変数は、インタフェースを記述するために使用されるか、クラス内で宣言が、ローカル変数が含まれていません。
タイプ | 名前 | 数量 | 説明 |
U2 | access_flags | 1 | これは、アクセスフラグフィールドを示します |
U2 | name_index | 1 | シンプルな名前、参照定数プール定数。 |
U2 | description_index | 1 | フィールドのデータ・タイプ、(数、タイプ、および順序を含む)メソッドパラメータリスト、および戻り値を記述するために使用 |
U2 | attributes_count | 1 | カウンタは、平均フィールドの(定数を除く)0であります |
attribute_info | 属性 | attributes_count | これは、いくつかの追加情報を格納するために使用しました |
access_flags値:
注:Java言語の分野では、オーバーロードされていない、データ型の二つのフィールド、修飾が同じであるセグメント記述子ワードが矛盾している場合は、しかし、バイトコードのために、別の名前を使用する必要があり、その重いフィールドそれが正式名称。
7.メソッドセットテーブル
構造の方法は、テーブルのテーブル列の構造とほぼ同様であり、唯一のオプションとアクセスフラグに違いがあるが、属性テーブルに設定されています。
注:Java言語では、メソッドをオーバーライドする、元のメソッドと同じ名前を有することに加えて、とも呼ばれるが、異なると元のメソッドのシグネチャを持つ必要があり、この署名機能は定数プール内の各パラメータの方法でありますJava言語ではなく、既存のメソッドのオーバーロードからの戻り値の異なるのみに依存して、戻り値がないである基準シンボルフィールドセット、。
u2 methods_count;//Class 文件的方法的数量
method_info methods[methods_count];//一个类可以有个多个方法
8、属性テーブル
u2 attributes_count;//此类的属性表中的属性数
attribute_info attributes[attributes_count];//属性表集合
特定のシナリオは、独自の情報を記述するために、クラスファイル属性テーブル、フィールドテーブル、方法テーブルの独自のセットをもたらすことができます。クラスファイルおよび他のデータ項目の順序は、属性テーブルを設定し、異なる長さやコンテンツの制限を必要とやや緩い、属性テーブルは、もはやそれぞれが厳密な順序を必要としない、と彼らは、既存の属性名を複製し、任意のはありませんコンパイラは属性テーブルに属性情報の独自の定義を書くことができます達成するため、無視は、Java仮想マシンが実行されている認識していない属性。
プロパティコード:
javacのコンパイルプロセス後のメソッド本体のJavaプログラムコードは、最終的にはコードプロパティに格納されているバイトコード命令になります。
タイプ | 名前 | 数量 | 説明 |
U2 | attribute_name_index | 1 | 文字列定数の指数を指して、「コード」としてコード |
U4 | attribute_length | 1 | 長さのポイント属性値 |
U2 | max_stack | 1 | オペランドスタックの最大深さの代表的な、JVMスタック深度値をオペランドスタックフレームに応じて割り当てられます。 |
U2 | max_locals | 1 | ローカル変数テーブルスペースに保存されています。前記スロットは、せいぜい32に使用されるローカル変数のメモリ割り当ての最小単位である... 64ビットのデータ・タイプのスロットを有する他のデータ型は、2つのスロットを格納するために必要とされます。 |
U4 | code_length | 1 | 代表バイトコードの長さ。所定の方法で、JVMは、タイプ長さ値U4であるが、以上65,535バイトコード命令を許可するが、実際には唯一長U2ありません。 |
U1 | コード | ・code_length | バイトストリームにバイトコード命令のシリーズを格納します。 |
U2 | exception_table_length | 1 | |
exception_info | exception_table | exception_table_length | |
U2 | attributes_count | 1 | |
attribute_info | 属性 | attributes_count |
ローカル変数テーブル:(この例では、隠されたパラメータを含む)メソッドのパラメータ、異常な処理パラメータ(つまり、定義されたのtry-catch catch例外文です)、メソッド本体で定義されたローカル変数を示しています。