【深入java虛擬機(jī)(2)】:class類文件結(jié)構(gòu)-編程開(kāi)發(fā)技術(shù)

【深入java虛擬機(jī)(2)】:class類文件結(jié)構(gòu)-編程開(kāi)發(fā)技術(shù)

ID:30776823

大?。?01.33 KB

頁(yè)數(shù):13頁(yè)

時(shí)間:2019-01-03

【深入java虛擬機(jī)(2)】:class類文件結(jié)構(gòu)-編程開(kāi)發(fā)技術(shù)_第1頁(yè)
【深入java虛擬機(jī)(2)】:class類文件結(jié)構(gòu)-編程開(kāi)發(fā)技術(shù)_第2頁(yè)
【深入java虛擬機(jī)(2)】:class類文件結(jié)構(gòu)-編程開(kāi)發(fā)技術(shù)_第3頁(yè)
【深入java虛擬機(jī)(2)】:class類文件結(jié)構(gòu)-編程開(kāi)發(fā)技術(shù)_第4頁(yè)
【深入java虛擬機(jī)(2)】:class類文件結(jié)構(gòu)-編程開(kāi)發(fā)技術(shù)_第5頁(yè)
資源描述:

《【深入java虛擬機(jī)(2)】:class類文件結(jié)構(gòu)-編程開(kāi)發(fā)技術(shù)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。

1、【深入Java虛擬機(jī)(2)】:Class類文件結(jié)構(gòu)-編程開(kāi)發(fā)技術(shù)【深入Java虛擬機(jī)(2)]:Class類文件結(jié)構(gòu)原文岀處:蘭亭風(fēng)雨平臺(tái)無(wú)關(guān)性Java是與平臺(tái)無(wú)關(guān)的語(yǔ)言,這得益于Java源代碼編譯后生成的存儲(chǔ)字節(jié)碼的文件,即Class文件,以及Java虛擬機(jī)的實(shí)現(xiàn)。不僅使用Java編譯器可以把Java代碼編譯成存儲(chǔ)字節(jié)碼的Class文件,使用JRuby等其他語(yǔ)言的編譯器也可以把程序代碼編譯成Class文件,虛擬機(jī)并不關(guān)心Class的來(lái)源是什么語(yǔ)言,只要它符合一定的結(jié)構(gòu),就可以在Java中運(yùn)行。Java語(yǔ)言中的各種變量、關(guān)鍵字和運(yùn)算符的語(yǔ)義最終都是市多條字節(jié)碼命令組合

2、而成的,兇此字節(jié)碼命令所能提供的語(yǔ)義描述能力肯定會(huì)比Java語(yǔ)言本身更強(qiáng)大,這便為其他語(yǔ)言實(shí)現(xiàn)一些有別于Java的語(yǔ)言特性提供了基礎(chǔ),而且這也正是在類加載時(shí)耍進(jìn)行安全驗(yàn)證的原因。類文件結(jié)構(gòu)???Class文件是一組以8位字節(jié)為基礎(chǔ)單位的二進(jìn)制流,各個(gè)數(shù)據(jù)項(xiàng)口嚴(yán)格按照順序緊湊地排列在Class文件中,中間沒(méi)冇添加任何分隔符,這使得整個(gè)Class文件中存儲(chǔ)的內(nèi)容幾乎全部都是程序運(yùn)行的必要數(shù)據(jù)。根據(jù)Java虛擬機(jī)規(guī)范的規(guī)定,Class文件格式釆用一種類似于C語(yǔ)言結(jié)構(gòu)體的偽結(jié)構(gòu)來(lái)存儲(chǔ),這種偽結(jié)構(gòu)中只有兩種數(shù)據(jù)類型:無(wú)符號(hào)數(shù)和表。無(wú)符號(hào)數(shù)屬于基本數(shù)據(jù)類型,以u(píng)l、u2、nd.

3、迪來(lái)分別代表1、2、4、8個(gè)字節(jié)的無(wú)符號(hào)數(shù)。表是由多個(gè)無(wú)符號(hào)數(shù)或其他表作為數(shù)據(jù)項(xiàng)構(gòu)成的符合數(shù)據(jù)類型,所冇的表都習(xí)慣性地以結(jié)尾。???整個(gè)Class文件本質(zhì)上就是一張表,它由如下所示的數(shù)據(jù)項(xiàng)構(gòu)成。???從表屮可以看出,無(wú)論是無(wú)符號(hào)數(shù)述是表,當(dāng)需耍描述同一類型但數(shù)量不定的多個(gè)數(shù)據(jù)時(shí),經(jīng)常會(huì)使用一個(gè)前置的容量計(jì)數(shù)器加若干個(gè)連續(xù)的該數(shù)據(jù)項(xiàng)的形式,稱這一系列連續(xù)的摸一個(gè)類型的數(shù)據(jù)為某一類型的集合,比如,fields_count個(gè)fieldjnfo表數(shù)據(jù)構(gòu)成了字段表集合。這里需要說(shuō)明的是:Class文件中的數(shù)據(jù)項(xiàng),都是嚴(yán)格按照上表中的順序和數(shù)量被嚴(yán)格限定的,每個(gè)字節(jié)代表的含義,

4、長(zhǎng)度,先后順序等都不允許改變。???下表列tBTClass文件中各個(gè)數(shù)據(jù)項(xiàng)的具體含義:類型名稱數(shù)量U4magic1U2minor_version1U2major_version1U2constant_pool_count1cp_infoconstant_poolconstant_pool_countU2access_flags1U2this_dass1U2superclass1U2interfaces_count1U2interfacesinterfaces_countU2fields_count1fieldinfofieldsfields_countU2metho

5、ds_count1method_infomethodsmethods_countU2atrtributes_count1attribute」nfoatrtributesatrtributes_count??從表中可以看出,無(wú)論是無(wú)符號(hào)數(shù)還是表,當(dāng)需要描述同一類型但數(shù)量不定的多個(gè)數(shù)據(jù)時(shí),經(jīng)常會(huì)在其前面使用一個(gè)前置的容量計(jì)數(shù)器來(lái)記錄其數(shù)量,而便跟著若干個(gè)連續(xù)的數(shù)據(jù)項(xiàng),稱這-系列連續(xù)的某-類型的數(shù)據(jù)為某-類型的集合,如:fields_count個(gè)field_info表數(shù)據(jù)便組成了方法表集合。這里需要注意的是:Class文件小齊數(shù)據(jù)項(xiàng)是按照上表的順序和數(shù)量被嚴(yán)格限定的,每個(gè)

6、字節(jié)代表的含義、長(zhǎng)度、先后順序都不允許改變。magic與version每個(gè)Class文件的頭4個(gè)字節(jié)稱為魔數(shù)(magic),它的唯一作用是判斷該文件是否為一個(gè)能被虛擬機(jī)接受的Class文件。它的值固定為OxCAFEBABEo緊接著magic的4個(gè)字節(jié)存儲(chǔ)的是Class文件的次版本號(hào)和主版本號(hào),高版本的JDK能向下兼容低版本的Class文件,但不能運(yùn)行更高版本的Class文件。conspoolmajor_version之后是常量池(constant_pool)的入口,它是Class文件中與其他項(xiàng)目關(guān)聯(lián)最多的數(shù)據(jù)類型,也是占用Class文件空間最大的數(shù)據(jù)項(xiàng)目乙一。常量池

7、屮主要存放兩大類常量:字而量和符號(hào)引用。字而量比較接近于Java層面的常量概念,如文本字符串、被聲明為final的常量值等。而符號(hào)引用總結(jié)起來(lái)則包括了下面三類常量:?類和接口的全限定名(即帶有包名的Class名,如:org.lxh.test.TestClass)?字段的名稱和描述符(private>static等描述符)?方法的名稱和描述符(private、static等描述符)虛擬機(jī)在加載Class文件時(shí)才會(huì)進(jìn)行動(dòng)態(tài)連接,也就是說(shuō),Class文件屮不會(huì)保存各個(gè)方法和字段的最終內(nèi)存布局信息,因此,這些字段和方法的符號(hào)引用不經(jīng)過(guò)轉(zhuǎn)換是無(wú)法直接被虛擬機(jī)使用的。當(dāng)虛擬

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。