1. 程式人生 > >class檔案結構與jvm位元組碼指令

class檔案結構與jvm位元組碼指令

https://blog.csdn.net/luckydog1991/article/details/51654964這篇文章詳細的介紹了class檔案和位元組碼指令

Class檔案結構

https://blog.csdn.net/tyrone1979/article/details/964560

class檔案是一組以8位位元組為基礎單位的二進位制流;

當遇到8位位元組以上的空間的資料項時,則會按照高位在前的方式分割成若干個8位位元組進行儲存。

class檔案中有2中資料型別,分別是無符號數和表;

  • 魔數
  • Class檔案版本
  • 常量池
  • 訪問標誌
  • 類索引、父類索引、介面索引集合
  • 欄位表集合
  • 方法表集合
  • 屬性表集合

u4 magic;                                 //識別Class檔案格式,具體值為0xCAFEBABE,

              u2 minor_version;            // Class檔案格式副版本號,

              u2 major_version;            // Class檔案格式主版本號,

              u2 constant_pool_count; //  常數表項個數,

              cp_info **constant_pool;// 常數表,又稱變長符號表,

              u2 access_flags;               //Class的宣告中使用的修飾符掩碼,

              u2 this_class;                   //常數表索引,索引內儲存類名或介面名,

              u2 super_class;                //常數表索引,索引內儲存父類名,

              u2 interfaces_count;        //超介面個數,

              u2 *interfaces;                 //常數表索引,各超介面名稱,

              u2 fields_count;       //類的域個數,

              field_info **fields;          //域資料,包括屬性名稱索引,

//域修飾符掩碼等,

              u2 methods_count;          //方法個數,

              method_info **methods;//方法資料,包括方法名稱索引,方法修飾符掩碼等,

              u2 attributes_count;        //類附加屬性個數,

              attribute_info **attributes; //類附加屬性資料,包括原始檔名等。

魔數

CA FE BA BE 4位16進位制數,轉換為二進位制數為(3405691582)

class檔案是以他開始,如果虛擬機器找不到他,直接報錯

Class檔案版本

00 00 00 34 魔數後4位

前2位次版本號

後2位主版本號為:jdk1.8 52

常量池

可以使用javap工具進行反編譯,得到相關的資料。

javap -verbose HelloWord.class

  cp_info **constant_pool;// 常數表,又稱變長符號表,

訪問標誌

u2 access_flags;               //Class的宣告中使用的修飾符掩碼

類索引、父類索引、介面索引集合

    u2 this_class;                   //常數表索引,索引內儲存類名或介面名,

              u2 super_class;                //常數表索引,索引內儲存父類名,

              u2 interfaces_count;        //超介面個數,

              u2 *interfaces;                 //常數表索引,各超介面名稱,

欄位表集合

    u2 fields_count;       //類的域個數,

            field_info **fields; //域資料,包括屬性名稱索引,

//域修飾符掩碼等,

方法表集合

  u2 methods_count;          //方法個數,

         method_info **methods;//方法資料,包括方法名稱索引,方法修飾符掩碼等,

屬性表集合

  u2 attributes_count;        //類附加屬性個數,

         attribute_info **attributes; //類附加屬性資料,包括原始檔名等。

位元組碼指令

Java虛擬機器的指令由一個位元組長度的,代表著某種特定操作還有的數字,稱之為操作碼,以及跟隨其後的0至多個代表此操作所需引數的運算元而構成。

操作碼的長度為1個位元組,因此最大隻有265條。

基於棧的指令架構

在虛擬機器的指令集中,大多數的指令都包含了其操作所對應的資料型別資訊。

iload fload

大多數指令是包含型別資訊的

也有不包含型別資訊的

goto 與型別無關

Arraylength 運算元組型別

型別多,指令少

虛擬機器指令的具體的分類

載入和儲存指令

載入和儲存指令用於將資料在棧幀中的區域性變量表和運算元棧之間來回傳輸。

    • 將區域性變量表載入到運算元棧:iload lload fload dload aload
    • 將一個數值從運算元棧儲存到區域性變量表:istore lfda
    • 將一個常量載入到運算元棧:bipush sipush ldc ldc_w ldc2_w aconst_null iconst_m1 iconst
    • 擴充區域性變量表訪問指令:wide

運算指令

型別轉換指令

物件的建立與訪問指令

操作樹棧指令

方法的呼叫和返回指令

 

異常處理指令

同步指令