類檔案結構的簡單描述
一、class類檔案的結構
1、常量池
常量池:用於存放編譯期生成的各種字面量和符號引用,這部分內容分將在類載入後進入方法區的執行時常量中存放。
字面量:比較接近java語言層面的常量概念,如文字字串、宣告為final的常量值等。
符號引用:屬於編譯原理方面的概念,包括了下面三類常量:
A、類和介面的全限定名 B、欄位的名稱和描述符 C、方法的名稱和描述符
2、訪問標誌
用於識別一些類或者介面層次的訪問資訊,包括:這個Class是類還是介面;是否定義為public型別;是否定義為abstract型別;如果是類的話,是否被宣告為final等。
3、類索引、父類索引與介面索引集合
類索引和父類索引都是一個u2型別的資料,而介面索引集合是一組u2型別的資料的集合,Class檔案中由這三項資料來確定這個類的繼承關係。
類索引:用於確定這個類的全限定名
父類索引:用於確定這個類的父類的全限定名
介面索引集合:用來描述這個類實現了哪些介面,這些被實現的介面將按implement語句後的介面順序從左到右排列在介面索引集合中。
4、欄位表集合
欄位表:用於描述介面或者類中宣告的變數。欄位包括類級變數以及例項級變數,但不包括在方法內部宣告區域性變數。
描述符:用來描述欄位的資料型別、方法的引數列表(包括數量、型別以及順序)和返回值
5、位元組碼指令
Java虛擬機器的指令由一個位元組長度、代表著某種指定操作含義的數字(稱為操作碼)以及跟隨其後的零至多個代表此操作所需要引數(稱為運算元)而構成。位元組碼指令集是一種具有鮮明特點、優劣勢很突出的指令集架構。
6、載入和儲存指令
載入和儲存指令用於將資料在棧針中的區域性變量表和運算元棧之間來回傳輸,這類指令包括如下內容:
(1)、將一個區域性變數載入到操作棧
(2)、將一個數值從運算元棧儲存到區域性變量表
(3)、將一個常量載入到運算元棧
(4)、擴充區域性變量表的訪問索引的指令:wide
儲存資料的運算元棧和區域性變量表主要就是由載入和儲存指令進行操作,除此之外,還有少量指令,如訪問物件的欄位或陣列元素的指令也會向運算元棧傳輸資料。
7、運算指令
運算或算術指令用於對兩個運算元棧上的值進行某種特定運算,並把結果重新存入到操作棧頂。大體上算術指令可以分為兩種:對整形資料進行運算的指令與對浮點型資料進行運算的指令。
8、型別轉換指令
型別轉換指令可以將兩種不同的數值型別進行相互轉換,這些轉換操作一般用於實現使用者程式碼中的顯式型別轉換操作。