ホームページ >Java >&#&チュートリアル >Javaのクラスファイル形式を図解で詳しく解説
JVMを理解し、Java言語を深く理解するには、クラスファイルの形式を学び理解することが宿題として必要です
Javaアーキテクチャにおけるクラスファイルの位置と役割
JVMとJava言語を理解するためにJava 言語の深い理解、クラス ファイルの形式の学習と理解は、すべて習得する必要があるレッスンです。 理由は非常に単純で、JVM が作成した Java ソース ファイルを理解できないため、JVM がクラス ファイルを認識するには、その前に Java ソース ファイルをクラス ファイルにコンパイルする必要があります。このインターフェースを理解することは、JVM の動作をよりよく理解するのに役立ちます。一方、クラス ファイルは、ソース ファイルで表現したい意味を別の方法で再記述します。 Java 言語と文法を深く理解するのに非常に役立ちます。 また、どのような言語であっても、クラスファイルにコンパイルできればJVMで認識して実行できるため、クラスファイルはクロスプラットフォームの基盤となるだけでなく、 JVM のクロス言語の基礎を理解することは、他の言語の JVM に基づいて学習するのに非常に重要です。
つまり、Java テクノロジー アーキテクチャ全体において、クラス ファイルは中間に位置し、システム全体を理解する上で接続する役割を果たします。 図に示すように:
クラスファイル形式の概要
クラスファイルは、各データ項目が前から後ろに順番に密に配置されており、隣接するものはありません。項目間のギャップにより、クラス ファイルが非常にコンパクトかつ軽量になり、JVM によってメモリにすばやくロードできるようになり、占有するメモリ領域が少なくなります。 Java ソース ファイルがコンパイルされると、各クラス (またはインターフェイス) は個別のクラス ファイルを占有し、クラス内のすべての情報がクラス ファイル内に記述されます。クラス ファイルは非常に柔軟であるため、Java ソースよりもさらに柔軟です。ファイルにはより強力な記述機能があります。
クラスファイル内の情報は 1 つずつ配置されており、各データは 1 バイトを占有するもの、2 バイトを占有するもの、4 バイトまたは 8 バイトを占有するものなど、異なる長さのデータ項目を表します。それぞれ u1、u2、u4、u8 で表され、それぞれデータ項目がクラス ファイル内で 1 バイト、2 バイト、4 バイト、8 バイトを占めることを示します。 u1、u2、u3、および u4 は、クラス ファイル データ項目の「タイプ」と考えることができます。 classクラスファイルに次のデータ項目が存在します(このチャートは「詳細なJava Virtual Machine」から参照されています):
type |
name | 数量 |
u4
|
魔法
|
1 |
u2 |
minor_version |
1 |
u2 |
メジャーバージョン |
1 |
u2 |
constant_pool_count |
1 |
cp_info |
constant_pool |
constant_pool_count - 1 |
u2 |
access_flags |
1 |
u2 |
this_class |
1 |
u2 |
スーパークラス |
1 |
u2 |
interfaces_count |
1 |
u2 |
インターフェース |
interfaces_count |
u2 |
fields_count |
1 |
field_info |
フィールド |
fields_count |
u2 |
methods_count |
1 |
method_info |
メソッド |
Methods_count |
u2 |
attribute_count |
1 |
属性情報 |
属性 |
attributes_count |
クラスファイルの各項目について詳しく説明します。
クラスファイルのマジックナンバーとバージョン番号
(1)マジック
クラスファイルの先頭の4バイトには、クラスファイルのマジックナンバーが格納されています。クラスファイルの場合は、固定値: 0XCAFEBABE です。 つまり、最初の4バイトが0XCAFEBABEでない場合は、クラスファイルではないためJVMで認識できないことを意味します。
(2)minor_versionとmajor_version
マジックナンバーの直後の4バイトはクラスファイルのバージョン番号とメジャーバージョン番号です。 Java の発展に伴い、クラス ファイルの形式もそれに応じて変更されます。 バージョン番号は、クラス ファイルがいつ追加または変更されたかを示します。 たとえば、異なるバージョンの javac コンパイラでコンパイルされたクラス ファイルのバージョン番号は異なる場合があり、異なるバージョンの JVM で認識されるクラス ファイルのバージョン番号も異なる場合があります。一般に、より上位のバージョンの JVM は、下位バージョンの javac コンパイラによってコンパイルされたクラス ファイルですが、下位バージョンの JVM は上位バージョンの javac コンパイラによってコンパイルされたクラス ファイルを認識できません。 下位バージョンの JVM を使用して上位バージョンのクラス ファイルを実行すると、JVM は java.lang.UnsupportedClassVersionError をスローします。特定のバージョン番号の変更についてはここでは説明しません。必要な読者は自分で情報を参照してください。
クラスファイルの定数プールの概要
クラスファイルでは、定数プールに関連するデータ項目はバージョン番号の後に配置されます。 定数プールは、クラス ファイル内の非常に重要なデータです。 定数プールには、テキストクラス ファイルの constant_pool_count の値は 1 で、各クラスに定数プールが 1 つだけあることを示します。 定数プール内のデータも隙間なく順次排出されます。定数プール内の各データ項目は以上がJavaのクラスファイル形式を図解で詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。