| インターネットメディアの種類 | アプリケーション/java-vm、アプリケーション/x-httpd-java、アプリケーション/x-java、アプリケーション/java、アプリケーション/java-byte-code、アプリケーション/x-java-class、アプリケーション/x-java-vm |
|---|---|
| 開発者 | サン・マイクロシステムズ |
Javaクラス ファイルは、 Java 仮想マシン (JVM)で実行できるJava バイトコードを含むファイル(ファイル名拡張子は.class )です。Java クラス ファイルは通常、 Javaクラスを含むJava プログラミング言語ソース ファイル( .javaファイル)からJava コンパイラによって生成されます(または、他のJVM 言語を使用してクラス ファイルを作成することもできます)。ソース ファイルに複数のクラスがある場合、各クラスは個別のクラス ファイルにコンパイルされます。したがって、 1 つのクラスのバイトコードを含むため、 .classファイルと呼ばれます。
JVM は多くのプラットフォームで利用可能であり、あるプラットフォームでコンパイルされたクラス ファイルは、別のプラットフォームの JVM でも実行されます。これにより、Java アプリケーションはプラットフォームに依存しなくなります。
歴史
2006年12月11日、クラスファイル形式はJava仕様要求(JSR)202に基づいて変更されました。 [1]
ファイルのレイアウトと構造
セクション
Java クラス ファイル構造には 10 個の基本セクションがあります。
- マジックナンバー:0xCAFEBABE
- クラスファイル形式のバージョン: クラスファイルのマイナーバージョンとメジャーバージョン
- 定数プール: クラスの定数のプール
- アクセス フラグ: たとえば、クラスが抽象クラスか静的クラスかなど。
- このクラス: 現在のクラスの名前
- スーパークラス: スーパークラスの名前
- インターフェース: クラス内の任意のインターフェース
- フィールド: クラス内の任意のフィールド
- メソッド: クラス内の任意のメソッド
- 属性: クラスの任意の属性 (たとえば、ソースファイルの名前など)
マジックナンバー
クラスファイルは、次の4バイトの ヘッダー(16進数)で識別されます:(下の表の最初の4つのエントリ)。このマジックナンバーCA FE BA BEの歴史は、パロアルトのレストランに言及したジェームズゴスリングによって説明されました:[2]
「私たちはよくセント マイケルズ アレイという店で昼食をとっていました。地元の言い伝えによると、遠い昔、グレイトフル デッドが有名になる前にそこで演奏していたそうです。そこは、間違いなくグレイトフル デッドらしい、かなりファンキーな場所でした。ジェリーが亡くなったとき、小さな仏教風の神社まで建てられました。私たちがそこに通っていたときは、その場所をカフェ デッドと呼んでいました。いつの間にか、これが 16 進数であることが分かりました。私はファイル形式のコードを作り直していて、2 つのマジック ナンバーが必要でした。1 つは永続オブジェクト ファイル用、もう 1 つはクラス用です。オブジェクト ファイル形式には CAFEDEAD を使用し、 "CAFE" の後に合う 4 文字の 16 進数ワード (良いテーマに思えました) をgrepで探していたところ、BABE にたどり着き、それを使うことにしました。当時は、それほど重要でもなければ、歴史のゴミ箱に捨てられる運命でもないと思われていました。そこで、CAFEBABE はクラス ファイル形式になり、CAFEDEAD は永続オブジェクト形式でした。しかし、永続オブジェクト機能は廃止され、それとともに CAFEDEAD も使用されなくなり、最終的にRMIに置き換えられました。"
全体レイアウト
クラス ファイルには可変サイズの項目が含まれており、埋め込まれたファイル オフセット (またはポインター) も含まれていないため、通常は最初のバイトから末尾に向かって順番に解析されます。最下位レベルでは、ファイル形式はいくつかの基本的なデータ型で説明されます。
- u1 : 符号なし8ビット整数
- u2 :ビッグエンディアンバイト順の符号なし16ビット整数
- u4 :ビッグエンディアンバイト順の符号なし32ビット整数
- テーブル: 何らかのタイプの可変長項目の配列。テーブル内の項目数は、先頭のカウント数 (カウントは u2) によって識別されますが、テーブルのバイト単位のサイズは、各項目を調べることによってのみ判断できます。
これらの基本型の一部は、コンテキストに応じて、より高レベルの値 (文字列や浮動小数点数など) として再解釈されます。ワード アラインメントは強制されないため、パディング バイトは使用されません。クラス ファイルの全体的なレイアウトは、次の表のようになります。
C言語のようなプログラミング言語での表現
C は構造体内で複数の可変長配列をサポートしていない ため、以下のコードはコンパイルされず、デモンストレーションとしてのみ機能します。
構造体Class_File_Format { u4マジックナンバー;
u2マイナーバージョン; u2メジャーバージョン;
u2定数プール数; cp_info定数プール[定数プール数- 1 ];
u2アクセスフラグ;
u2 this_class ; u2スーパークラス;
u2インターフェース数; u2インターフェース[インターフェース数];
u2 fields_count ; field_infoフィールド[ fields_count ];
u2メソッド数; method_infoメソッド[メソッド数];
u2属性数; attribute_info属性[属性数]; }
定数プール
定数プール テーブルには、リテラル定数値のほとんどが格納されます。これには、あらゆる種類の数値、文字列、識別子名、クラスとメソッドへの参照、型記述子などの値が含まれます。定数プール テーブル内の特定の定数へのすべてのインデックスまたは参照は、16 ビット (タイプ u2) の数値で指定され、インデックス値 1 はテーブルの最初の定数を参照します (インデックス値 0 は無効です)。
ファイル形式の開発中に行われた歴史的な選択により、定数プール テーブル内の定数の数は、実際にはテーブルの前の定数プール カウントと同じではありません。まず、テーブルは 1 (0 ではなく) からインデックス付けされますが、カウントは実際には最大インデックスに 1 を加えたものとして解釈する必要があります。[6] さらに、2 種類の定数 (long と double) がテーブル内の連続する 2 つのスロットを占有しますが、2 番目のスロットは直接使用されることのないファントム インデックスです。
定数プール内の各項目 (定数) の型は、最初のバイトタグによって識別されます。このタグに続くバイト数とその解釈は、タグ値によって異なります。有効な定数型とそのタグ値は次のとおりです。
整数定数型は、integer と long の 2 つだけです。boolean、byte、short など、高級言語に現れるその他の整数型は、整数定数として表現する必要があります。
Java のクラス名は、完全修飾されている場合、伝統的に「java.lang.Object」のようにドットで区切られます。ただし、低レベルのクラス参照定数内では、「java/lang/Object」のように代わりにスラッシュを使用する内部形式が使用されます。
Unicode 文字列は、「UTF-8 文字列」という呼び名にもかかわらず、実際には Unicode 標準に従ってエンコードされているわけではありませんが、類似しています。違いは 2 つあります (詳細についてはUTF-8 を参照してください)。1 つ目は、コード ポイント U+0000 が、C0 80標準の 1 バイト エンコード ではなく、2 バイト シーケンス (16 進数)としてエンコードされること00です。2 つ目は、補助文字 ( BMPの外側の U+10000 以上) が、UTF-8 を使用して直接エンコードされるのではなく、 UTF-16に似たサロゲート ペア構造を使用してエンコードされることです。この場合、2 つのサロゲートはそれぞれ UTF-8 で個別にエンコードされます。たとえば、U+1D11E は、ED A0 B4 ED B4 9E正しい 4 バイトの UTF-8 エンコード ではなく、 6 バイト シーケンス としてエンコードされますF0 9D 84 9E。
参照
参考文献
- ^ JSR 202 Java クラスファイル仕様の更新
- ^ ジェームズ・ゴスリングからビル・バンガーナーへの私信
- ^ 「第4章 クラスファイル形式」
- ^ 「JDK 10 リリース ノート」。
- ^ 「[JDK-8148785] JDK-9 のクラス ファイル バージョンを 53 に更新 - Java Bug System」。
- ^ abcdefg 「第4章 クラスファイル形式」
さらに読む
- Tim Lindholm、Frank Yellin (1999)。Java 仮想マシン仕様 (第 2 版)。Prentice Hall。ISBN 0-201-43294-3. 2008年10月13日閲覧。Java 仮想マシンの公式定義ドキュメント。クラス ファイル形式が含まれています。この本の第 1 版と第 2 版はどちらもオンラインで無料で閲覧およびダウンロードできます。
