Java仮想マシンの知識-classファイル

ファイル全体の内容を行いクラスファイルがそれぞれのデータ項目に基づいて、バイト単位で8ビットのバイナリストリームのセットが正確な順序コンパクトクラスファイルに配置されている任意の中間セパレータを追加していないが、クラスに格納されているほぼすべての手順実行に必要なデータは、隙間がありません。データ項目の以上8つのバイトを占有する必要性に直面したとき、実施形態に係るいくつかのエンディアンバイト8が格納されているに分割されます。

Java仮想マシンの知識-classファイル

クラスファイル構造記述
マジック:マジックナンバー。唯一の役割は、ファイルが、ファイルのクラスの仮想マシンを受信できるかどうかを決定することです。固定値:0xCAFEBABE。
minor_version:マイナーバージョンのクラスファイル。
major_version:クラスファイルのメジャーバージョン番号。
constant_pool_count:定数プールカウンター。
constant_pool [constant_pool_count]:定数プール。文字列定数、クラスやインタフェース名、フィールド名と他の定数が含まれています。同じ特性を有する各々が定数プールは、即ち、マーカーの第一のタイプのようなバイトはフォーマットを決定するために使用されます。
access_flags:アクセスフラグ。クラスまたはインタフェースの特性を表しており、アクセスするために使用されます。
this_class:現在のクラスのインデックス。
super_class:親インデックス。
interfaces_count:インターフェイスカウンタ。現在のクラスまたはインタフェースの直接のスーパークラスの数。
インターフェイス[interfaces_count]:インタフェース表。
fields_count:フィールドカウンタ。現フィールドのクラスファイルのメンバーの数。
フィールド[fields_count]:フィールド・テーブル。
methods_count:カウンタ方式。メソッドの数。
方法[methods_count]:メソッドテーブル。
attributes_count:プロパティのカウンター。属性の数。
[attributes_count]属性:プロパティ・シート。
たとえば
、以下のクラスのはTest2.classをコンパイル。

クラスTest2を{公共
のpublic static int型1 = I;
公共の静的な無効メイン(){
System.out.printlnは(I);
}
}
進視聴者によってオープンTest2.class。

Java仮想マシンの知識-classファイル

クラスファイルの構造の説明、最初の4バイトのマジックナンバーoxcafebabe。次のマイナーバージョン番号とメジャーバージョン番号ox0000とox0034、52、52及び0小数はJDK1.8を表すので、JDKバージョン1.8.0。

あなたはまた、バイトコードファイルを解析するために、組み込みのJavaの逆コンパイラツールを使用することができます。Test2.class -vコマンドてjavap。

クラスファイル/E:/CODE/JVM/Test2.class
最終2019年7月19日に変更しました。サイズ219バイトの
MD5チェックサム841c66674d71005bc6a97fe6c3b0fb1d
"Test2.java"より作成
パブリッククラスTest2を
マイナーバージョン:0
メジャーバージョン:52の
旗:ACC_PUBLIC、ACC_SUPER
定数プール:
第1位= Methodref#4.#13 //のJava / langは/オブジェクト「。 <初期化> ":()は、V
#2 =するFieldRef#3#14 // Test2.i:I
=クラス#15 // Test2を#3
#4 =クラス#16 //のJava / LANG /オブジェクト
#5 = UTF8私は
#6 = UTF8 I
#7 = UTF8 <初期化>
#8 = UTF8()は、V
#9 = UTF8コード
#10 = UTF8 LineNumberTable
#11 = UTF8 SOURCEFILE
#12 = UTF8 Test2.java
#13 = NameAndType#7:# 8 // "の<init>" :()V
#14 = NameAndType#5:#6 //私は:I
#15 = UTF8 Test2を
#16 = UTF8のJava / langは/オブジェクト
{
公共のint I。
記述:I
フラグ:ACC_PUBLIC

Test2を公開();
記述子:()V
フラグ:ACC_PUBLIC
コード:
スタック= 2、地元の人々程度= 1、args_size = 1。。
0:aload_0
1:方法、invokespecial#1 // Javaの/ LANG /オブジェクト"の<init>" :(。。。 )V
4:aload_0
5:iconst_1で
6:フィールド、PutField#2 // I:I
9:戻り
LineNumberTableを:
行1:0
行2 :. 4
}
SOURCEFILE: "Test2.java"
Java仮想マシンの制限
各クラスまたはインタフェースの最大65,535の定数プール。
クラスまたはインタフェースのフィールドの数が65535を宣言することができます。
インタフェースで宣言されたクラスやメソッドの数が65535まで可能。
クラスまたはインタフェースのインタフェース65535の直接の親。
メソッドが呼び出されたときに、スタックフレームは、最大のデジタル65535のローカル変数のローカル変数テーブルを作成しています。
方法フレームのオペランドスタックの最大深さは65535です。
255までのメソッドパラメータ。
名前フィールドとメソッド、および方法は、フィールド識別子と文字列値他の定数65,535文字の最大長を記載しました。
アレイの最大寸法は、255次元です。
この記事の著者と同じように、承認ポイントを与える見て、毎日のJava関連の記事を共有することができます!そのようなソースコードなどの学習教材の統合など、随時提示メリット、インタビューの質問、~~があります。

おすすめ

転載: blog.51cto.com/14440597/2424364