1. 程式人生 > >【Java】「深入理解Java虛擬機」學習筆記(4)- 類文件結構

【Java】「深入理解Java虛擬機」學習筆記(4)- 類文件結構

jruby idt this 原因 cal constant borde ESS groov

  我為什麽喜歡Java,另重要原因就是跨平臺,就是WORA。

  程序員是爽了,但肯定有人要為你遮風擋雨,解決WORA的基石就是字節碼+虛擬機

?Tip

  Java生態中的語言有很多,處理Java本身還有Scala、Groovy和Jruby。然而虛擬機只管跟底層操作系統打交道,對上層它只認字節碼。那麽跟各種語言打交道的

就是翻譯家—編譯器。字節碼的載體就是.class文件。

  字節碼,是以8個字節為單位的二進制文件,整個文件中排列緊湊,從頭到尾不含一個分隔符。那麽字節碼的構成是什麽樣的呢?

一、字節碼文件的構成

1、魔數與版本

  每個.class文件都是以CAFEBABE四個字節開始,它的作用就是標識這個文件是.class文件。

  第五到第八這四個字節是.class文件的版本號。Java的策略是向下兼容,就是高版本的虛擬機可以跑低版本的字節碼,反過來不行。

2、常量池(Constant Pool)

  包含字面量(literal)和符號引用(Symbolic References)。常量數是不固定的,所以常量池區域在字節碼文件中以常量計數器開始。

    ①字面量可以認為是Java中的常量,包括字符串、final常量。

    ②符號引用包括,類和接口的全限定名、字段的名稱和描述符、方法的名稱和描述符。

  需要指出的是,常量的表示很復雜,每種常量都用自己獨特的數據結構來表達。  

?字節碼分析工具javap

  查看x.class文件中的常量池可以用命令:

    javap -verbose x。

3、訪問標識(access_flag)

  訪問標識長度為兩個字節(16位),其中8位已被定義。它主要用來表示類或接口的屬性等信息(如public、abstract、final等)。

4、類索引(this_class)、父類索引(super_class)及接口索引(interfaces)集合

  用來確定類的繼承和實現關系。

5、字段表集合(field_info)

  描述類或接口中定義的字段。

6、方法表集合

7、屬性表集合(attribute_info)

  每個類、字段、方法需要用自己特有的數據結構來表示,這種數據結構就是屬性表。

  另外,字節碼指令跟匯編指令一樣,也由操作碼(opcode)和操作數(operands)構成。

  

【Java】「深入理解Java虛擬機」學習筆記(4)- 類文件結構