什么是字節(jié)碼
字節(jié)碼(Byte-code)是一種包含執(zhí)行程序蝇更,由一序列 op 代碼/數(shù)據(jù)對組成的二進制文件妻枕,是一種中間碼。字節(jié)是電腦里的數(shù)據(jù)量單位。
字節(jié)碼文件展示
首先了解一張圖 java字節(jié)碼總覽圖
魔數(shù) 四個字節(jié)
首先講一下魔數(shù)占四個字節(jié)對應(yīng) 上圖demo.class 0Xcafe babe表示java的class文件。好奇的你發(fā)現(xiàn) cafe babe 約等于下張圖
版本號 4個字節(jié)
對應(yīng)demo 0X0000 0033 其中前面的0000是次版本號投放,后面的0033是主版本號。通過進制轉(zhuǎn)換得到的是次版本號為0适贸,主版本號為51
常量池
緊接著主版本號之后的就是常量池入口灸芳。常量池是Class文件中的資源倉庫,在接下來的內(nèi)容中我們會發(fā)現(xiàn)很多地方會涉及拜姿,如Class Name烙样,Interfaces等。常量池中主要存儲2大類常量:字面量和符號引用蕊肥。字面量如文本字符串误阻,java中聲明為final的常量值等等,而符號引用如類和接口的全局限定名晴埂,字段的名稱和描述符,方法的名稱和描述符寻定。
- 0×0015:由于常量池的數(shù)量不固定(n+2)儒洛,所以需要在常量池的入口處放置一項u2類型的數(shù)據(jù)代表常量池數(shù)量。因此該16進制是21狼速,表示有20項常量琅锻,索引范圍為1~20。明明是21,為何是20呢恼蓬?因為Class文件格式規(guī)定惊完,設(shè)計者就講第0項保留出來了,以備后患处硬。從這里我們知道接下來我們需要翻譯出20項常量小槐。
Constant #1 (一共有20個常量,這是第一個荷辕,以此類推…)
0x0a-:從常量類型表中我們發(fā)現(xiàn)凿跳,第一個數(shù)據(jù)均是u1類型的tag,16進制的0a是十進制的10疮方,對應(yīng)表中的MethodRef_info控嗜。
0x-00 04-:Class_info索引項#4
0x-00 11-:NameAndType索引項#17
Access_Flag 訪問標志
訪問標志信息包括該Class文件是類還是接口,是否被定義成public骡显,是否是abstract疆栏,如果是類,是否被聲明成final惫谤。通過上面的源代碼壁顶,我們知道該文件是類并且是public。
后續(xù)可以參考java程序如何按照字節(jié)碼翻譯