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

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

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

版本號(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)常量。

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。

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