Java仮想マシンのクラスの知識[ファイル]

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

クラスファイルの構造

クラスファイルの構造の説明

  1. マジック:マジックナンバー。唯一の役割は、ファイルが、ファイルのクラスの仮想マシンを受信できるかどうかを決定することです。固定値:0xCAFEBABE。

  2. minor_version:マイナーバージョンのクラスファイル。

  3. major_version:クラスファイルのメジャーバージョン番号。

  4. constant_pool_count:定数プールカウンター。

  5. constant_pool [constant_pool_count]:定数プール。文字列定数、クラスやインタフェース名、フィールド名と他の定数が含まれています。同じ特性を有する各々が定数プールは、即ち、マーカーの第一のタイプのようなバイトはフォーマットを決定するために使用されます。

  6. access_flags:アクセスフラグ。クラスまたはインタフェースの特性を表しており、アクセスするために使用されます。

  7. this_class:現在のクラスのインデックス。

  8. super_class:親インデックス。

  9. interfaces_count:インターフェイスカウンタ。現在のクラスまたはインタフェースの直接のスーパークラスの数。

  10. インターフェイス[interfaces_count]:インタフェース表。

  11. fields_count:フィールドカウンタ。現フィールドのクラスファイルのメンバーの数。

  12. フィールド[fields_count]:フィールド・テーブル。

  13. methods_count:カウンタ方式。メソッドの数。

  14. 方法[methods_count]:メソッドテーブル。

  15. attributes_count:プロパティのカウンター。属性の数。

  16. [attributes_count]属性:プロパティ・シート。

以下のクラスをコンパイルTest2.class

public class Test2 {
    public static int i = 1;
    public static void main() {
        System.out.println(i);
    }
}

進ビューアで開きますTest2.class

六角

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

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

Classfile /E:/CODE/JVM/Test2.class
  Last modified 2019-7-19; size 219 bytes
  MD5 checksum 841c66674d71005bc6a97fe6c3b0fb1d
  Compiled from "Test2.java"
public class Test2
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #4.#13         // java/lang/Object."<init>":()V
   #2 = Fieldref           #3.#14         // Test2.i:I
   #3 = Class              #15            // Test2
   #4 = Class              #16            // java/lang/Object
   #5 = Utf8               i
   #6 = Utf8               I
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               SourceFile
  #12 = Utf8               Test2.java
  #13 = NameAndType        #7:#8          // "<init>":()V
  #14 = NameAndType        #5:#6          // i:I
  #15 = Utf8               Test2
  #16 = Utf8               java/lang/Object
{
  public int i;
    descriptor: I
    flags: ACC_PUBLIC

  public Test2();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: iconst_1
         6: putfield      #2                  // Field i:I
         9: return
      LineNumberTable:
        line 1: 0
        line 2: 4
}
SourceFile: "Test2.java"

Java仮想マシンの制限

  • クラスまたはインタフェース65535の各定数プール。
  • クラスまたはインタフェースのフィールドの数が65535を宣言することができます。
  • インタフェースで宣言されたクラスやメソッドの数が65535まで可能。
  • クラスまたはインタフェースのインタフェース65535の直接の親。
  • メソッドが呼び出されたときに、スタックフレームは、最大のデジタル65535のローカル変数のローカル変数テーブルを作成しています。
  • 方法フレームのオペランドスタックの最大深さは65535です。
  • 255までのメソッドパラメータ。
  • 名前フィールドとメソッド、および方法は、フィールド識別子と文字列値他の定数65,535文字の最大長を記載しました。
  • アレイの最大寸法は、255次元です。

参考:「Java仮想マシン仕様(Java SEのバージョン8)「Java仮想マシン(第二版)、の深い理解」」。

おすすめ

転載: www.cnblogs.com/bigshark/p/11229409.html