【Java】「深入理解Java虛擬機」學習筆記(4)- 類文件結構
我為什麽喜歡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)- 類文件結構