45.0-45.65535
,JDK1.2支援45.0-46.65535
常數池之後兩個位元組代表存取標誌。例如:是類還是介面,是否是public,是否是abstract等等
CONSTANT_Class_info
的類描述符常數。又通過該常數的CONSTANT_Utf8_info
找到全限定名字串。(public,private,protected,static,final,volatile,transient)
,字元數據型別(基本型別,物件,陣列),欄位名稱[
表示,如定義了java.lang.String [][]
則記錄爲[[Ljava/lang/String;
String test(char [] chars)
爲 ([C)[Ljava/lang/String;
volatile,transient
,但多了synchronized,native,strictfp,abstract
關鍵字Code
的屬性裏面<cinit>()
,範例構造器<init>()
方法Class檔案,欄位表,方法表都可以攜帶自己的屬性表集合,以描述某些場景專有的資訊。
attribute_name_index
是指向CONSTANT_Utf8_info
的索引,固定爲"Code",代表該屬性名稱attribute_length
指示了屬性值的長度,爲u4max_stack
代表了運算元棧深度的最大值。根據該值來分配棧幀中的運算元棧深度。max_locals
代表了區域性變數表所需的儲存空間。單位是Slot(變數槽),變數槽是虛擬機器爲區域性變數分配記憶體所使用的最小單位。不超過32位元的一個槽,double和long佔用兩個槽。max_locals
的大小code_length
,code
儲存Java源程式編譯後生成的位元組碼指令。每個指令是u1的單位元組。可以對應找出該位元組碼代表什麼指令。start_pc
到第end_pc
出現了型別爲catch_type
或其子類的異常,則轉到第handle_pc
行繼續處理。列舉出方法中可能拋出的受查異常。即方法中throws後面列舉的異常。
描述Java原始碼行號和位元組碼行號的對應關係。非必須,但如果沒有,拋出異常時不會顯示出錯行號,偵錯程式也無法按照原始碼設定斷點。
描述棧幀中區域性變數表的變數和Java原始碼中定義的變數之間的關係。非必須,但沒有當其他人參照方法,所有參數名稱將會丟失,用arg0,arg1等替代參數名。
用於記錄生成這個Class檔案的原始碼檔名稱.大多數類,類名和檔名一致,但有例外。
ConstantValue
進行初始化。否則會選擇在<cinit()
方法初始化。用於記錄內部類和宿主類之間的關聯。
Deprecated屬性用於表示某個類,欄位或者方法,已經被程式作者定爲不再推薦使用。可以用@deprecated
註解進行設定。
Synthetic屬性標識此欄位或方法不是由Java原始碼直接產生的,而是由編譯器自行新增的。
在虛擬機器類載入的位元組碼驗證階段被新型別檢查驗證器使用。
若包含了型別變數或參數化型別,則該屬性會爲他記錄泛型簽名資訊
儲存invokedynamic
指令參照的引導方法限定符
記錄方法的各個形參名稱和資訊
支援Java模組化相關功能
記錄了類,欄位,方法的宣告上記錄執行時可見註解
由一個位元組長度的操作碼和零或多個的運算元構成.是面向運算元棧的,所以大多數指令不包括運算元,只有操作碼.指令參數都放在運算元棧中。
用於將數據在棧幀中的區域性變數表和運算元棧之間來回傳輸
用於對運算元棧上的兩個值進行某種特定運算,並且把結果重新存入操作棧頂
大致分爲兩種型別:對整數數據,浮點型數據
不存在直接支援byte,short,char,boolean的運算,都是用操作int型別的指令代替
int 轉 long,float,double
,long轉folat,double
,float轉double
Java虛擬機器對類範例和陣列的建立使用了不同的位元組碼指令
將運算元棧頂一個或者兩個元素出棧:pop,pop2
將棧頂最頂端兩個數值交換:swap
有條件或無條件的修改PC暫存器的值,從指定位置指令的下一條指令繼續執行程式
各種型別的比較最終都會轉化爲int型別的比較操作
invokevirtual
:用於呼叫物件的實體方法,根據物件的實際型別進行分派(虛方法分派)invokeinterface
:用於呼叫介面方法,在執行時搜尋一個實現了這個介面方法的物件,找出合適的方法呼叫invokespecial
:呼叫一些需要特殊處理的實體方法,例如範例初始化方法,私有方法,父類別方法invokestatic
:用於呼叫靜態方法(static)方法invokedynamic
:用於在執行時動態解析出調用點限定符所參照的方法對顯示拋出異常的操作(throw語句)進行處理
而處理異常(catch語句)不由位元組碼指令實現,是由異常表實現
Java虛擬機器可以支援方法級同步和方法內部一段指令序列的同步,使用管程實現.
執行執行緒要求先成功持有管程,然後才能 纔能執行方法,最後當方法完成時釋放管程
使用synchronized語句塊表示
無論這個方法是正常結束還是異常退出,方法呼叫的每條monitorenter指令都必須有其對應的monitorexit指令
<<Java虛擬機器規範>>描繪了Java虛擬機器應有的共同程式儲存格
式:Class檔案格式以及位元組碼指令集
任何一款Java虛擬機器都必須能讀取Class檔案並且精確實現其中的Java虛擬機器程式碼的語意
Java虛擬機器只要外部介面與規範描述一致即可,具體實現不規定
Class檔案格式具備平臺中立,緊湊,穩定,可延伸性的特點。是Java技術體系實現平臺無關,語言無關的重要支柱
<<Java虛擬機器規範>>描繪了Java虛擬機器應有的共同程式儲存格
式:Class檔案格式以及位元組碼指令集
任何一款Java虛擬機器都必須能讀取Class檔案並且精確實現其中的Java虛擬機器程式碼的語意
Java虛擬機器只要外部介面與規範描述一致即可,具體實現不規定
Class檔案格式具備平臺中立,緊湊,穩定,可延伸性的特點。是Java技術體系實現平臺無關,語言無關的重要支柱
Class檔案是Java虛擬機器執行引擎的數據入口。