Javaクラスファイル
ファイルレイアウトと構造 > 一般的レイアウト

クラスファイルは可変長の項目を含み、組み込まれたファイルのオフセット（またはポインタ）すら含まないため、通常は最初のバイトから最後まで順番に解析される。最も低レベルな点から、ファイルフォーマットはいくつかの基本的なデータ型の点から記述される:
u1: 符号なし8ビット整数
u2: ビッグエンディアンバイト順の符号なし16ビット整数
u4: ビッグエンディアンバイト順の符号なし32ビット整数
テーブル: いくつかの型の可変長の配列。テーブルのテーブル内の項目数はカウント数により識別されるが、テーブルのバイト内のサイズは項目それぞれを調査することのみで決定される。
これらの基礎的な型の一部は、前後関係に依存することで次に（文字列や浮動小数点数といった）上位レベルの値として再解釈される。
ワードが一直線に並ぶことは強制されないので、パディングバイトは常に利用されない。
クラスファイルの全てのレイアウトは以下のテーブル内のように見られる。
| バイトオフセット | サイズ | 型あるいは値 | 記述 |
| --- | --- | --- | --- |
| 0 | 4バイト | u1 = 0xCA 十六進 | クラスファイルフォーマットに適合するファイルを識別するために使用されるマジックナンバー (CAFEBABE) |
| 1 | 4バイト | u1 = 0xFE 十六進 | クラスファイルフォーマットに適合するファイルを識別するために使用されるマジックナンバー (CAFEBABE) |
| 2 | 4バイト | u1 = 0xBA 十六進 | クラスファイルフォーマットに適合するファイルを識別するために使用されるマジックナンバー (CAFEBABE) |
| 3 | 4バイト | u1 = 0xBE 十六進 | クラスファイルフォーマットに適合するファイルを識別するために使用されるマジックナンバー (CAFEBABE) |
| 4 | 2バイト | u2 | 使用されるクラスファイルフォーマットのマイナーバージョン数 |
| 5 | 2バイト | u2 | 使用されるクラスファイルフォーマットのマイナーバージョン数 |
| 6 | 2バイト | u2 | 使用されるクラスファイルフォーマットのメジャーバージョン数。 JDK 1.1 = 45（0x2D 十六進）、 JDK 1.2 = 46（0x2E 十六進）、 JDK 1.3 = 47（0x2F 十六進）、 JDK 1.4 = 48（0x30 十六進）、 J2SE 5.0 = 49（0x31 十六進）、 JavaSE 6.0 = 50（0x32 十六進）、 JavaSE 7 = 51（0x33 十六進）、以降メジャーバージョン毎に1ずつ加算。 初期バージョン数の詳細についてはThe JavaTM Virtual Machine Specification 2nd editionの脚注を参照すること。 |
| 7 | 2バイト | u2 | 使用されるクラスファイルフォーマットのメジャーバージョン数。 JDK 1.1 = 45（0x2D 十六進）、 JDK 1.2 = 46（0x2E 十六進）、 JDK 1.3 = 47（0x2F 十六進）、 JDK 1.4 = 48（0x30 十六進）、 J2SE 5.0 = 49（0x31 十六進）、 JavaSE 6.0 = 50（0x32 十六進）、 JavaSE 7 = 51（0x33 十六進）、以降メジャーバージョン毎に1ずつ加算。 初期バージョン数の詳細についてはThe JavaTM Virtual Machine Specification 2nd editionの脚注を参照すること。 |
| 8 | 2バイト | u2 | 定数プールカウント、以下の定数プールテーブル内のエントリ数。このカウントは少なくとも1つは実在のエントリ数よりも大きい。以下の議論を参照すること。 |
| 9 | 2バイト | u2 | 定数プールカウント、以下の定数プールテーブル内のエントリ数。このカウントは少なくとも1つは実在のエントリ数よりも大きい。以下の議論を参照すること。 |
| 10 | cpsize（変数） | テーブル | 定数プールテーブル、リテラル数、文字列、そしてクラスやメソッドへの参照といった項目を含む、可変長の定数プールエントリ。合計エントリ（定数テーブルカウント - 1）数を含む、1から始まり索引付けされる（脚注を参照すること）。 |
| ... | cpsize（変数） | テーブル | 定数プールテーブル、リテラル数、文字列、そしてクラスやメソッドへの参照といった項目を含む、可変長の定数プールエントリ。合計エントリ（定数テーブルカウント - 1）数を含む、1から始まり索引付けされる（脚注を参照すること）。 |
| ... | cpsize（変数） | テーブル | 定数プールテーブル、リテラル数、文字列、そしてクラスやメソッドへの参照といった項目を含む、可変長の定数プールエントリ。合計エントリ（定数テーブルカウント - 1）数を含む、1から始まり索引付けされる（脚注を参照すること）。 |
| ... | cpsize（変数） | テーブル | 定数プールテーブル、リテラル数、文字列、そしてクラスやメソッドへの参照といった項目を含む、可変長の定数プールエントリ。合計エントリ（定数テーブルカウント - 1）数を含む、1から始まり索引付けされる（脚注を参照すること）。 |
| 10+cpsize | 2バイト | u2 | ビットマスクによるアクセスフラグ |
| 11+cpsize | 2バイト | u2 | ビットマスクによるアクセスフラグ |
| 12+cpsize | 2バイト | u2 | 「クラス」型エントリの定数プールへのインデックスである、thisクラスを識別する |
| 13+cpsize | 2バイト | u2 | 「クラス」型エントリの定数プールへのインデックスである、thisクラスを識別する |
| 14+cpsize | 2バイト | u2 | 「クラス」型エントリの定数プールへのインデックスである、スーパークラスを識別する |
| 15+cpsize | 2バイト | u2 | 「クラス」型エントリの定数プールへのインデックスである、スーパークラスを識別する |
| 16+cpsize | 2バイト | u2 | インタフェースカウント、以下のインタフェーステーブル内のエントリの数 |
| 17+cpsize | 2バイト | u2 | インタフェースカウント、以下のインタフェーステーブル内のエントリの数 |
| 18+cpsize | isize（変数） | テーブル | インタフェーステーブル、可変長インタフェースの配列 |
| ... | isize（変数） | テーブル | インタフェーステーブル、可変長インタフェースの配列 |
| ... | isize（変数） | テーブル | インタフェーステーブル、可変長インタフェースの配列 |
| ... | isize（変数） | テーブル | インタフェーステーブル、可変長インタフェースの配列 |
| 18+cpsize+isize | 2バイト | u2 | 変数カウント、以下のフィールド内のエントリの数 |
| 19+cpsize+isize | 2バイト | u2 | 変数カウント、以下のフィールド内のエントリの数 |
| 20+cpsize+isize | fsize（変数） | テーブル | フィールドテーブル、フィールドの可変長配列 |
| ... | fsize（変数） | テーブル | フィールドテーブル、フィールドの可変長配列 |
| ... | fsize（変数） | テーブル | フィールドテーブル、フィールドの可変長配列 |
| ... | fsize（変数） | テーブル | フィールドテーブル、フィールドの可変長配列 |
| 20+cpsize+isize+fsize | 2バイト | u2 | メソッドカウント、以下のメソッドテーブル内のエントリ数 |
| 21+cpsize+isize+fsize | 2バイト | u2 | メソッドカウント、以下のメソッドテーブル内のエントリ数 |
| 22+cpsize+isize+fsize | msize（変数） | テーブル | メソッドテーブル、メソッドの可変長配列 |
| ... | msize（変数） | テーブル | メソッドテーブル、メソッドの可変長配列 |
| ... | msize（変数） | テーブル | メソッドテーブル、メソッドの可変長配列 |
| ... | msize（変数） | テーブル | メソッドテーブル、メソッドの可変長配列 |
| 22+cpsize+isize+fsize+msize | 2バイト | u2 | 属性カウント、以下の属性テーブル内のエントリ数 |
| 23+cpsize+isize+fsize+msize | 2バイト | u2 | 属性カウント、以下の属性テーブル内のエントリ数 |
| 24+cpsize+isize+fsize+msize | asize（変数） | テーブル | 属性テーブル、属性の可変長配列 |
| ... | asize（変数） | テーブル | 属性テーブル、属性の可変長配列 |
| ... | asize（変数） | テーブル | 属性テーブル、属性の可変長配列 |
| ... | asize（変数） | テーブル | 属性テーブル、属性の可変長配列 |