如何理解JavaClass文件常量池

這篇文章將為大家詳細講解有關(guān)如何理解Java Class文件常量池,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

10余年的青川網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整青川建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“青川網(wǎng)站設(shè)計”,“青川網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

Class文件的存在使得不同語言編寫的程序都可以運行在Java虛擬機上,只需要這些語言經(jīng)過編譯器編譯后的Class文件符合Java虛擬機定義的規(guī)范,Java虛擬機就可以加載執(zhí)行這些Class文件。如下圖所示:

如何理解Java Class文件常量池  


Class文件是一組以8位字節(jié)為基礎(chǔ)單位的二進制流,各個數(shù)據(jù)項目嚴格按照順序緊湊地排列在Class文件中,當(dāng)遇到需要占用8個字節(jié)以上空間的數(shù)據(jù)是,則按照大端序的方式分割成若干個8位字節(jié)進行存儲。

Class文件中只存在兩種數(shù)據(jù)類型:

  • 無符號數(shù)

無符號數(shù)屬于基本數(shù)據(jù)類型,以u1、u2、u4、u8分別表示1個、2個、4個和8個字節(jié)的無符號數(shù),無符號數(shù)可以用來描述數(shù)字、索引引用、數(shù)量值或者按照UTF-8編碼構(gòu)成的字符串值。

表是由無符號數(shù)和其他表組成的數(shù)據(jù)結(jié)構(gòu),所有的表都以_info結(jié)尾。

當(dāng)在描述一個可變長度的類型數(shù)據(jù)時,通常會采用一個容量計數(shù)器和若干個數(shù)據(jù)項的格式。

如何理解Java Class文件常量池  
public class ClassTest {
   private int m;
   private int inc() {        return m + 1;    }}
 

下面我們會通過上面這段代碼來分析Class文件的內(nèi)容。

如何理解Java Class文件常量池  


上面這張圖是經(jīng)過編譯后的Class文件中的內(nèi)容

 
魔數(shù)(magic)與版本號

Class文件開頭固定的4個字節(jié)為魔數(shù),唯一作用就是用來確定這個文件是否是一個能被虛擬機接收的class文件。Java的魔數(shù)固定為0xCAFEBABE,接下去的兩個字節(jié)代表次要版本號,再下去的兩個字節(jié)是主版本號,主版本號為0x0034(十進制是52,也就是JDK1.8),高版本的JDK能夠運行以前版本的Class文件,但是不能運行以后版本的Class文件,通俗一點將就是向下兼容。

 
常量池

走過了魔數(shù)和版本,接下去是Class文件中最關(guān)鍵的部分常量池,常量池由一個計數(shù)池和具體的常量項來組成,在我們代碼中常量池數(shù)量為0x0013(十進制是19),關(guān)于常量池的計數(shù)池有一個比較特殊的地方就是他是從1開始計數(shù)的,也就是說如果我們計數(shù)池的值是19,實際上是只有18個常量項。

常量池中主要存放兩大類常量:

  • 字面量
  • 符號引用

字面量主要指的是文本字符串、聲明為final的常量值等

符號引用主要包含三類常量:

  • 類和接口的全限定名
  • 字段的名稱和描述符
  • 方法的名稱和描述符

Java代碼在編譯的時候不存在連接時,也就是Class文件中不會保存各個方法、字段的最終內(nèi)存布局信息,這些字段、方法的符號引用如果在運行期不進行轉(zhuǎn)換則得不到真正的內(nèi)存入口地址,所以在虛擬機運行時,需要從常量池獲得對應(yīng)的符號引用,在類創(chuàng)建和運行時解析翻譯到具體的內(nèi)存地址中。

目前常量池中主要有以下表項:如何理解Java Class文件常量池

這些表都會有一個固定的字段也就是開始的第一個字節(jié)都是一個標志位代表相應(yīng)的類型,如上圖。

大家可以通過javap -verbose xxx.class列出文件字節(jié)碼的內(nèi)容如何理解Java Class文件常量池

通過比較javap -verbose常量池的項的索引和我們class文件二進制的表示可以發(fā)現(xiàn)是一一對應(yīng)的。

關(guān)于如何理解Java Class文件常量池就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

網(wǎng)站欄目:如何理解JavaClass文件常量池
轉(zhuǎn)載來于:http://muchs.cn/article0/ihisoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、ChatGPT、動態(tài)網(wǎng)站商城網(wǎng)站、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管