Java Class檔案結構例項分析(下)
發表文章之後,發現很多圖片顯示不了,請閱讀我的公眾號文章,以獲得本文最佳體驗:
本篇我們繼續分析Class檔案結構的方法及屬性部分內容,上節內容回顧請檢視:
Class檔案格式資訊
繼續上節例項程式碼
package chapter6;
public class TestClass {
private int m;
public int inc() {
return m + 1;
}
}
使用JDK1.8編譯成class檔案,然後通過WinHex開啟
方法
上節我們分析到欄位部分,欄位的完整地址範圍:000000E1~000000EA。
跟在欄位後面的是方法,下面繼續分析。
方法計數器(methods_count)
型別:u2
位元組地址:000000EB~000000EC
值:0x0002
說明當前類有2個方法。
第1個方法
訪問標誌(access_flags)
型別:u2
位元組地址:000000ED~000000EE
值:0x0001
查表得到對應的訪問標誌為ACC_PUBLIC。
名稱索引(name_index)
型別:u2
位元組地址:000000EF~000000F0
值:0x0007
對應常量池中的第7項常量,值為<init>
,即例項初始化方法。
描述符(descriptor_index)
型別:u2
位元組地址:000000F1~000000F2
值:0x0008
對應常量池中的第8項常量,值為()V,說明該方法無引數,返回型別為void。
由前3項可知,第1個方法為類的例項初始化方法。
屬性計數器(attributes_count)
型別:u2
位元組地址:000000F3~000000F4
值:0x0001
說明該欄位有1個屬性。
屬性的通用格式如下:
第1個屬性
名稱索引(attribute_name_index)
型別:u2
位元組地址:000000F5~000000F6
值:0x0009
對應常量池中的第9項常量,值為Code。
屬性值的長度(attribute_length)
型別:u4
位元組地址:000000F7~000000FA
值:0x0000002F
將0x0000002F轉換為十進位制,計算得到47。
運算元棧的最大深度(max_stack)
型別:u2
位元組地址:000000FB~000000FC
值:0x0001
即最大深度為1。運算元棧的最大深度,由編譯期決定。
區域性變數的個數(max_locals)
型別:u2
位元組地址:000000FD~000000FE
值:0x0001
即區域性變數的個數為1。區域性變數的個數,由編譯期決定。
max_locals的單位是Slot,Slot是虛擬機器為區域性變數分配記憶體所使用的最小單位。對於長度不超過32位的資料型別,每個區域性變數佔用1個Slot。而double和long的資料型別長度為64位,需要佔用兩個Slot。
code[]陣列的位元組數(code_length)
型別:u4
位元組地址:000000FF~00000102
值:0x00000005
位元組碼指令(code)
型別:u1
長度/位元組數:5
位元組地址:00000103~00000107
其中,第0、1、4位元組為位元組碼指令,第2、3位元組為引數索引。
常量池
例項初始化方法位元組碼指令資訊
其中,初始化方法是沒有引數的,但args_size為1。這其實是因為對於非static方法,編譯器預設會將指向當前物件的this作為方法的第一個引數,以便在呼叫方法的時候使用。
異常表長度(exception_table_length)
型別:u2
位元組地址:00000108~00000109
值:0x0000
說明沒有異常表資訊。
異常表(exception_table)
無
屬性計數器(attributes_count)
型別:u2
位元組地址:0000010A~0000010B
值:0x0002
說明該欄位有2個屬性。
第1個方法Code屬性的第1個屬性
名稱索引(attribute_name_index)
型別:u2
位元組地址:0000010C~0000010D
值:0x000C
對應常量池中的第12項常量,值為LineNumberTable,即位元組碼與原始碼的行號資訊。
LineNumberTable屬性值的長度(attribute_length)
型別:u4
位元組地址:0000010E~00000111
值:0x00000006
LineNumberTable行號表的長度(line_number_table_length)
型別:u2
位元組地址:00000112~00000113
值:0x0001
位元組碼與原始碼行號(位元組地址:00000114~00000117)
第1個方法Code屬性的第2個屬性
名稱索引(attribute_name_index)
型別:u2
位元組地址:00000118~00000119
值:0x000D
對應常量池中的第13項常量,值為LocalVariableTable,即方法的本地變量表資訊。
LocalVariableTable屬性值的長度(attribute_length)
型別:u4
位元組地址:0000011A~0000011D
值:0x0000000C
將0x0000000C轉換為十進位制,計算得到12。
LocalVariableTable區域性變量表的長度(local_variable_table_length)
型別:u2
位元組地址:0000011E~0000011F
值:0x0001
LocalVariableTable第1個區域性變數(位元組地址:00000120~00000129)
start_pc和length兩者結合起來就是這個區域性變數在位元組碼之中的作用域範圍。
也就是說,這個區域性變數為this,型別為chapter6/TestClass,存放在區域性變量表的第0個Slot,作用域為code[0]~code[4]。
第1個方法對應的位元組內容
第2個方法
訪問標誌(access_flags)
型別:u2
位元組地址:0000012A~0000012B
值:0x0001
查表得到對應的訪問標誌為ACC_PUBLIC。
名稱索引(name_index)
型別:u2
位元組地址:0000012C~0000012D
值:0x0010
對應常量池中的第16項常量,值為inc,正是我們定義的例項方法名。
描述符(descriptor_index)
型別:u2
位元組地址:0000012E~0000012F
值:0x0011
對應常量池中的第17項常量,值為()I,說明該方法無引數,返回型別為int。
以上3項,說明該方法定義為public int inc()。
屬性計數器(attributes_count)
型別:u2
位元組地址:00000130~00000131
值:0x0001
說明該欄位有1個屬性。
第1個屬性
名稱索引(attribute_name_index)
型別:u2
位元組地址:00000132~00000133
值:0x0009
對應常量池中的第9項常量,值為Code。
Code屬性值的長度(attribute_length)
型別:u4
位元組地址:00000134~00000137
值:0x00000031
將0x00000031轉換為十進位制,計算得到49。
Code運算元棧的最大深度(max_stack)
型別:u2
位元組地址:00000138~00000139
值:0x0002
即最大深度為2。
Code區域性變數的個數(max_locals)
型別:u2
位元組地址:0000013A~0000013B
值:0x0001
即區域性變數的個數為1。
code[]陣列的位元組數(code_length)
型別:u4
位元組地址:0000013C~0000013F
值:0x00000007
Code位元組碼指令(code)
型別:u1
長度/位元組數:7
位元組地址:00000140~00000146
其中,第0、1、4、5、6位元組為位元組碼指令,第2、3位元組為引數索引。
常量池
例項初始化方法位元組碼指令資訊
Code異常表長度(exception_table_length)
型別:u2
位元組地址:00000147~00000148
值:0x0000
說明沒有異常表資訊。
Code異常表(exception_table)
無
Code屬性計數器(attributes_count)
型別:u2
位元組地址:00000149~0000014A
值:0x0002
說明該欄位有2個屬性。
第2個方法Code屬性的第1個屬性
名稱索引(attribute_name_index)
型別:u2
位元組地址:0000014B~0000014C
值:0x000C
對應常量池中的第12項常量,值為LineNumberTable。
值為LineNumberTable屬性值的長度(attribute_length)
型別:u4
位元組地址:0000014D~00000150
值:0x00000006
值為LineNumberTable行號表的長度(line_number_table_length)
型別:u2
位元組地址:00000151~00000152
值:0x0001
位元組碼與原始碼行號(位元組地址:00000153~00000156)
第2個方法Code屬性的第2個屬性
名稱索引(attribute_name_index)
型別:u2
位元組地址:00000157~00000158
值:0x000D
對應常量池中的第13項常量,值為LocalVariableTable。
LocalVariableTable屬性值的長度(attribute_length)
型別:u4
位元組地址:00000159~0000015C
值:0x0000000C
將0x0000000C轉換為十進位制,計算得到12。
LocalVariableTable區域性變量表的長度(local_variable_table_length)
型別:u2
位元組地址:0000015D~0000015E
值:0x0001
LocalVariableTable第1個區域性變數(位元組地址:0000015F~00000168)
start_pc和length兩者結合起來就是這個區域性變數在位元組碼之中的作用域範圍。
也就是說,這個區域性變數為this,型別為chapter6/TestClass,存放在區域性變量表的第0個Slot,作用域為code[0]~code[6]。
第2個方法對應的位元組內容
類的屬性計數器(attributes_count)
型別:u2
位元組地址:00000169~0000016A
值:0x0001
說明該類有1個屬性。
第1個屬性
名稱索引(attribute_name_index)
型別:u2
位元組地址:0000016B~0000016C
值:0x0014
對應常量池中的第12項常量,值為SourceFile,即class檔案的Java原始檔名稱。
屬性值的長度(attribute_length)
型別:u4
位元組地址:0000016D~00000170
值:0x00000002
類的原始檔名稱索引(sourcefile_index)
型別:u2
位元組地址:00000171~00000172
值:0x0015
對應常量池中的第21項常量,值為TestClass.java。
位元組碼內容
參考
《Java虛擬機器規範》(Java SE 8版)
《深入理解Java虛擬機器 JVM高階特性與最佳實踐》
個人公眾號
二進位制之路
相關推薦
Java Class檔案結構例項分析(下)
發表文章之後,發現很多圖片顯示不了,請閱讀我的公眾號文章,以獲得本文最佳體驗: 本篇我們繼續分析Class檔案結構的方法及屬性部分內容,上節內容回顧請檢視: Class檔案格式資訊 繼續上節例項程式碼 package chapter6; public
Java Class檔案結構例項分析(上)
發表文章之後,發現很多圖片顯示不了,請閱讀我的公眾號文章,以獲得本文最佳體驗: 本文假定讀者對Java Class檔案格式有一些基本的瞭解,建議結合相關書籍進行對照閱讀。 Class檔案格式資訊 例項程式碼 package chapter6; public
Class檔案結構全面解析(下)
接上回書 書接上一回,分享了Class檔案的主要構成,同時也詳細分析了魔數、次版本號、主版本號、常量池集合、訪問標誌的構造,接下來我們就繼續學習。 歡迎關注微信公眾號:萬貓學社,每週一分享Java技術乾貨。 類索引和父類索引 類索引(this_class)和父類索引(super_class)都是一個u2型別的
Class檔案結構全面解析(上)
什麼是Class檔案? 在Java剛剛誕生的時候就提出了一個非常著名的口號:“一次編寫,到處執行。(Write Once,Run Anywhere)”。為了實現平臺無關性,各種不同平臺的虛擬機器都統一使用一種程式儲存格式,就是位元組碼(ByteCode)。它就以二進位制位元組流的方式被存放在Class檔案中,
【資料結構與演算法-java實現】二 複雜度分析(下):最好、最壞、平均、均攤時間複雜度的概念
上一篇文章學習了:如何分析、統計演算法的執行效率和資源消耗? 點選連結檢視上一篇文章:複雜度分析上 今天的文章學習以下內容: 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度 1、最好與最壞情況時間複雜度 我們首先
資料結構和算法系列3--複雜度分析(下)
複雜度分析的4個概念 1.最壞情況時間複雜度:程式碼在最理想情況下執行的時間複雜度。 2.最好情況時間複雜度:程式碼在最壞情況下執行的時間複雜度。 3.平均時間複雜度:用程式碼在所有情況下執行的次數的加權平均值表示。 4.均攤時間複雜度:在程式碼執行的所有複雜度情況中絕大部分是低級別的複
資料結構與演算法(二)——複雜度分析(下)
資料結構與演算法(二)—— 複雜度分析(下) 除了前面記錄的複雜度的基礎知識,還有四個複雜度分析方面的知識點:最好情況時間複雜度、最壞情況時間複雜度、平均情況時間複雜度、均攤時間複雜度。 一、最好、最壞情況時間複雜度 最好情況時間複雜度,就是在最理想的情況下,
深度解析Java 8:AbstractQueuedSynchronizer的實現分析(下)
前言 經過本系列的上半部分JDK1.8 AbstractQueuedSynchronizer的實現分析(上)的解讀,相信很多讀者已經對AbstractQueuedSynchronizer(下文簡稱AQS)的獨佔功能瞭然於胸,那麼這次我們通過對另一個工具類:CountDo
Java Class檔案結構
平臺無關性和語言無關性 Java在剛剛誕生的時候提出過一個宣傳口號:“一次編寫,到處執行”,這句話充分表達了軟體開發人員對衝破平臺界限的渴求。“與平臺無關”的理想最終實現在作業系統的應用層上:Sun公司及其他虛擬機器提供商釋出了許多可以執行在各種不同平臺上的虛
以太坊原始碼深入分析(4)-- 以太坊RPC通訊例項和原理程式碼分析(下)
上一節我們試著寫了一個RPC的請求例項,通過分析原始碼知道了RPC服務的建立流程,以及Http RPC server建立過程,Http RPC Client的請求流程。這一節,先分析一下Http RPC server如何處理client的請求。然後再分析一下IPC RPC的處
Java class 檔案結構及解析
java檔案經過編譯之後就可以形成class檔案。簡而言之,java檔案是我們自己書寫的檔案,也是給我們看的,而class檔案則是給VM看的。但是我們用notepad檢視class檔案時,卻發現那是一串二進位制的檔案。那麼class檔案到底是些啥東西呢? 本質
java與javax的區別分析(轉)
mes ges 歷史 java虛擬機 虛擬 over 問題 c語言 enc Java是一種受C語言影響的編程語言。Java和Javax本質上是與Java編程語言的上下文一起使用的包。實際上Java和Javax沒有區別。這只是不同的名字。 Java是一種編程語言,受到C語言
Java的LockSupport.park()實現分析(轉載)
兩個 這也 his access 需要 tracking orm return 指令 LockSupport類是Java6(JSR166-JUC)引入的一個類,提供了基本的線程同步原語。LockSupport實際上是調用了Unsafe類裏的函數,歸結到Unsafe裏,只有
《JAVA經典算法40題(下)》
ali display 小寫字母 algo 運算 sca 個位與萬位相同 由於 can 【程序21】 ? 題目:求1+2!+3!+...+20!的和 ? 1.程序分析:此程序只是把累加變成了累乘。 ? public class Ex21 { static long sum
Java並發AQS原理分析(一)
jpg 子類 ole success ces || pro 同步 無法 我們說的AQS就是AbstractQueuedSynchronizer,他在java.util.concurrent.locks包下,這個類是Java並發的一個核心類。第一次知道有這個類是在看可重入鎖R
C++筆記 第九課 函式過載分析(下)---狄泰學院
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第九課 函式過載分析(下) 1.過載與指標 下面的函式指標將儲存哪個函式的地址?第一個 函式過載遇上函式指標 將過載函式名賦值給函式指標時 1.根據過載規則挑選與函式指標引
【資料運營】在運營中,為什麼文字分析遠比數值型分析重要?一個實際案例,五點分析(下)
https://www.pmcaff.com/article/index/408451832537216?from=profile 本文是《資料分析中,文字分析遠比數值型分析重要!》的下篇,以一個實際案例來聊聊文字分析在實際運營中如何落地。行為脈絡如下:先簡要講述文字分析的分支---情緒分析的基本原
《深入理解 Java 記憶體模型》讀書筆記(下)(乾貨,萬字長文)
0. 前提 1. 基礎 2. 重排序 3. 順序一致性 4. Volatile 5. 鎖 6. final 7. 總結 4. Volatile 4.1 VOLATILE 特性 舉個例子: publ
第四章 語法分析(下)——LR文法
文章目錄 概述 基本概念 移動-歸約語法分析技術 SLR 增廣文法 狀態內部擴充套件 狀態之間的擴充套件 構建分析表 ACTION 構造SLR語法分析表
Ext4檔案系統架構分析(一)
本文描述Ext4 檔案系統磁碟佈局和元資料的一些分析,同樣適用於ext2,ext3檔案系統,除了它們不支援的ext4的特性。整個分析分兩篇博文,分別概述佈局和詳細介紹各個佈局的資料結構及組織定址方式等。 1.Ext4 檔案系統佈局綜述 一個Ext4 檔案系統被分成一系列