ホームページ  >  記事  >  Java  >  Javaのクラスファイル形式を図解で詳しく解説

Javaのクラスファイル形式を図解で詳しく解説

黄舟
黄舟オリジナル
2017-06-18 09:45:321809ブラウズ

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 をスローします。特定のバージョン番号の変更についてはここでは説明しません。必要な読者は自分で情報を参照してください。

クラスファイルの定数プールの概要

クラスファイルでは、定数プールに関連するデータ項目はバージョン番号の後に配置されます。 定数プールは、クラス ファイル内の非常に重要なデータです。 定数プールには、テキスト

文字列、定数値、現在のクラスのクラス名、フィールド名、メソッド名、各フィールドとメソッドの記述子、現在のクラスのフィールドとメソッドへの参照情報、およびその他の参照が保存されます。現在のクラスのリファレンス情報など定数プールには、クラス内のほぼすべての情報の記述が含まれています。また、クラス ファイルの他の多くの部分には、後述する this_class、super_class、field_info、attribute_info などのデータ項目への参照が含まれています。 bytes コード命令内にも定数プールへの参照があり、この定数プールへの参照はバイトコード命令のオペランドとして使用されます。 さらに、定数プール内の各項目も相互に参照します。

クラス ファイルの constant_pool_count の値は 1 で、各クラスに定数プールが 1 つだけあることを示します。 定数プール内のデータも隙間なく順次排出されます。定数プール内の各データ項目は

index を通じてアクセスされます。これは配列に似ていますが、定数プール内の最初の項目のインデックスが 0 ではなく 1 である点が異なります。0 のインデックスが、クラスファイル 定数プール項目は、定数プール項目を参照しないことを意味します。クラス ファイル内の各データ項目には独自の型があります。同様に、定数プール内の各データ項目にも独自の型があります。 定数プールのデータ項目の種類は次のとおりです。

1 CONSTANT_Float4 long型リテラルdouble型リテラルクラスまたはインターフェースへのシンボリック参照文字列型リテラル値フィールドへのシンボリック参照宣言されたメソッドへのシンボリック参照クラス内インターフェースで宣言されたメソッドへのシンボリック参照への部分的なシンボリック参照フィールドまたはメソッド

定数プールのデータ項目の種類

type flag

type description

CONSTANT_Utf8

float型リテラル

CONSTANT_Long

5

CONSTANT_Double

6

CONSTANT_Class

7

CONSTANT_String

8

CONSTANT_Fieldref

9

CONSTANT_Methodref

10

CONSTANT_InterfaceMethodref

11

CONSTANT_NameAndType

12

各データ項目は XXX_info 項目と呼ばれます。たとえば、定数プール内のタイプ CONSTANT_Utf8 の項目は CONSTANT_Utf8_info です。さらに、各情報項目にはフラグ値 (タグ) があり、このフラグ値は、この定数プール内の情報項目のタイプを示します。 CONSTANT_Utf8_info タグ値は 1 です。 CONSTANT_Fieldref_info のタグ値は 9 です。
Java プログラムは動的にリンクされます。動的リンクの実装では、定数プールが重要な役割を果たします。 定数プールには、いくつかのリテラルの保存に加えて、次のシンボリック参照も保存されます:


(1) クラスとインターフェイスの完全修飾名


(2) フィールド名と記述子


(3 ) メソッド名と記述子


定数プール内の各データ項目を詳しく説明する前に、まずクラス ファイル内の

特殊文字

文字列について理解する必要があります。定数プールでは特殊な文字列が大量に出現するため、これらの特殊な文字列は完全に前述の修飾名と記述子。 定数プール内の各データ項目を理解するには、まずこれらの特殊な文字列を理解する必要があります。

以上がJavaのクラスファイル形式を図解で詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。