深入理解JAVA虛擬機(jī)學(xué)習(xí)筆記14——Class類文件的結(jié)構(gòu)(2訪問標(biāo)志, 繼承, 實(shí)現(xiàn))

各位朋友,上一篇的常量池都掌握了吧,我們的口號(hào)是:每天進(jìn)步一點(diǎn)點(diǎn)!

開始之前,我們先鞏固并擴(kuò)充一下昨天的知識(shí),用Excel表示一下就是這樣的(請?jiān)徆P者low到爆的畫圖水平,畫這種圖有什么好的工具,朋友們可以推薦一下啊)。

請注意?。?!這里有個(gè)地方需要補(bǔ)充個(gè)一下,那就是當(dāng)常量的類型是CONSTANT_Utf8_info的時(shí)候,看一下它的類型,length是它的字符串長度,意思是代表有多少個(gè)bytes(字節(jié))。

我們舉一個(gè)例子,tag為“01”,接著的“00

06”說明長度為6,向后查四個(gè)字節(jié),分別為“3c”、“69”、“6e”、“69”、“74”、“3e”,轉(zhuǎn)換成十進(jìn)制為60、105、110、105、116和62,既然是字符串,我們對照一下ASCII碼,居然是“”?。?!我得天哪!

眼見為實(shí)(密集恐懼癥不要看!)。

下面開始今天的學(xué)習(xí)。

五、訪問標(biāo)志:對照一下結(jié)構(gòu)表,在常量池結(jié)束之后,接著就是訪問標(biāo)志(access)了,類型是U2也就是占兩個(gè)字節(jié)。

注意,這個(gè)和前面的查找方式就有些不同了,不再是把16進(jìn)制轉(zhuǎn)化成10進(jìn)制然后到表里面去找了。

而是表里面的每一項(xiàng)對應(yīng)16個(gè)bit位中的一個(gè),如果為真(1),就說明有這個(gè)限定符,否則就是沒有(這么做真是省了不少空間啊)。

目前限定符只有8個(gè),如下表所示,標(biāo)志值代表所在的位置,其余的用補(bǔ)0。

我們找到文件中的標(biāo)志位,值為“00 21”,轉(zhuǎn)換為二進(jìn)制就是“0000 0000 0010 0001”。

讓我們再次打開Excel,表格圖形走一走(這里筆者有個(gè)疑問,為什么不按順序依次排列呢,有知道的朋友希望不吝賜教)。

我們就會(huì)看到,這個(gè)類的限定組合是ACC_PUBLIC+ACC_SUPER,6不6?

等等,看到這個(gè)“ACC_PUBLIC”,筆者不由得虎軀一震,不知道大家還記得前文提到過的ASM嗎?

給大家上一小段寫過的測試代碼,這里肯定有一些不可告人的秘密!

六、繼承與實(shí)現(xiàn):其實(shí)就是結(jié)構(gòu)表中的類索引(this_class),父類索引(super_class)和接口索引個(gè)數(shù)(interfaces_count)+接接口索引(interface)。

這里簡單說一下這個(gè)“索引”,如果說數(shù)據(jù)庫的索引,大家肯定都知道,是用來快速查找的。其實(shí)這里的意思也差不多,當(dāng)所有的類都加載到內(nèi)存中,會(huì)生成一個(gè)包名+類名的唯一標(biāo)識(shí),就是所說的這個(gè)“索引”,虛擬機(jī)就可以根據(jù)類索引找到這個(gè)類。

為什么接口和類的結(jié)構(gòu)不一樣?因?yàn)閖ava是單根繼承,只能繼承一個(gè)類或接口;但是卻可以實(shí)現(xiàn)多個(gè)接口。

為了直觀一些,我們把執(zhí)行javap反編譯的截圖再拿回來。

類索引(this_class):類型為u2,指向常量池中的某個(gè)常量。對應(yīng)的值是“0x0005”,即指向#5->#26,也就是com/xkx/App。

父類索引(super_class):類型為u2,指向常量池中的某個(gè)常量。對應(yīng)的值是“0x0006”,即指向#6->#27,也就是java/lang/Object。

接口索引個(gè)數(shù)(interfaces_count):類型為u2,記錄了實(shí)現(xiàn)接口的個(gè)數(shù)。和常量池其實(shí)是一樣的,先記錄一個(gè)數(shù)量,后面是對應(yīng)的數(shù)據(jù),筆者把它理解為Map

interfaces_count,Object[] interfaces>。

接口索引(interface):接口的索引,如果上面的個(gè)數(shù)為0,那么這部分就沒有。如果有的話,每一個(gè)接口索引占兩個(gè)字節(jié),也是指向一個(gè)接口的地址。

好了,今天就寫這么多吧,明天繼續(xù)!

喜歡文章或想一起學(xué)習(xí)的朋友可以關(guān)注我,給我點(diǎn)贊,我將會(huì)持續(xù)更新,有什么疑問或文中有不當(dāng)之處請給我留言,真誠地希望能與大家一起交流探討,學(xué)習(xí)進(jìn)步。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容