什么是字節(jié)碼?

什么是字節(jié)碼

字節(jié)碼(Byte-code)是一種包含執(zhí)行程序,由一序列 op 代碼/數(shù)據(jù)對(duì)組成的二進(jìn)制文件,是一種中間碼。字節(jié)是電腦里的數(shù)據(jù)量單位。

字節(jié)碼文件展示

image.png

首先了解一張圖 java字節(jié)碼總覽圖

image.png

魔數(shù) 四個(gè)字節(jié)

首先講一下魔數(shù)占四個(gè)字節(jié)對(duì)應(yīng) 上圖demo.class 0Xcafe babe表示java的class文件。好奇的你發(fā)現(xiàn) cafe babe 約等于下張圖


image.png

版本號(hào) 4個(gè)字節(jié)

對(duì)應(yīng)demo 0X0000 0033 其中前面的0000是次版本號(hào),后面的0033是主版本號(hào)。通過(guò)進(jìn)制轉(zhuǎn)換得到的是次版本號(hào)為0,主版本號(hào)為51

常量池

緊接著主版本號(hào)之后的就是常量池入口。常量池是Class文件中的資源倉(cāng)庫(kù),在接下來(lái)的內(nèi)容中我們會(huì)發(fā)現(xiàn)很多地方會(huì)涉及,如Class Name,Interfaces等。常量池中主要存儲(chǔ)2大類(lèi)常量:字面量和符號(hào)引用。字面量如文本字符串,java中聲明為final的常量值等等,而符號(hào)引用如類(lèi)和接口的全局限定名,字段的名稱(chēng)和描述符,方法的名稱(chēng)和描述符。

  • 0×0015:由于常量池的數(shù)量不固定(n+2),所以需要在常量池的入口處放置一項(xiàng)u2類(lèi)型的數(shù)據(jù)代表常量池?cái)?shù)量。因此該16進(jìn)制是21,表示有20項(xiàng)常量,索引范圍為1~20。明明是21,為何是20呢?因?yàn)镃lass文件格式規(guī)定,設(shè)計(jì)者就講第0項(xiàng)保留出來(lái)了,以備后患。從這里我們知道接下來(lái)我們需要翻譯出20項(xiàng)常量。
image.png

Constant #1 (一共有20個(gè)常量,這是第一個(gè),以此類(lèi)推…)
0x0a-:從常量類(lèi)型表中我們發(fā)現(xiàn),第一個(gè)數(shù)據(jù)均是u1類(lèi)型的tag,16進(jìn)制的0a是十進(jìn)制的10,對(duì)應(yīng)表中的MethodRef_info。
0x-00 04-:Class_info索引項(xiàng)#4
0x-00 11-:NameAndType索引項(xiàng)#17

Access_Flag 訪問(wèn)標(biāo)志

訪問(wèn)標(biāo)志信息包括該Class文件是類(lèi)還是接口,是否被定義成public,是否是abstract,如果是類(lèi),是否被聲明成final。通過(guò)上面的源代碼,我們知道該文件是類(lèi)并且是public。


Access_Flag.png

后續(xù)可以參考java程序如何按照字節(jié)碼翻譯

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

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

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