常量池計(jì)數(shù)器
這里的U2 標(biāo)識(shí)常量池的大小 0x0023 十進(jìn)制數(shù)為32+3=35
常量池計(jì)數(shù)器后面是常量池 (是一個(gè)表結(jié)構(gòu))
常量池的長(zhǎng)度是 35-1 =34 即常量池的計(jì)數(shù)-1 這里共有34項(xiàng)
每一項(xiàng)都是表結(jié)構(gòu),
常量池主要是存儲(chǔ)字符串常量,類(lèi),接口名,字段名和其他常量
java虛擬機(jī)就是依賴這些常量池中的表結(jié)構(gòu)進(jìn)行運(yùn)行
常量池中項(xiàng)(cp_info)的結(jié)構(gòu)
項(xiàng)通用結(jié)構(gòu):
[圖片上傳失敗...(image-2837bd-1607741032471)]
ps 這里的 info[] 只是一個(gè)結(jié)構(gòu)的概況,不是真實(shí)的結(jié)構(gòu), 具體的結(jié)構(gòu)取決于tag的值
tag 為無(wú)符號(hào)數(shù) (有14種項(xiàng)類(lèi)型)
常量池中34項(xiàng)的第一項(xiàng)的tag=10 對(duì)應(yīng)到tag項(xiàng)說(shuō)明中常量類(lèi)型為 CONSTANT_Methodref
簡(jiǎn)單翻譯是 方法常量引用類(lèi)型
每一個(gè)類(lèi)型都有其特有的表結(jié)構(gòu)
CONSTANT_Methodref 的表結(jié)構(gòu)(方法項(xiàng)) 這里是#1
這里顯示是占據(jù)了5個(gè)U1, 這個(gè)結(jié)構(gòu)就是cp_info的一種具像表示 截圖如下:
0x0006 表示的是類(lèi)索引 十進(jìn)制表示為 #6
0x0015 表示的是名稱(chēng)或者類(lèi)型索引 十進(jìn)制表示為 #21
ps: 可以通過(guò)java -p MainTest.class 來(lái)顯示
CONSTANT_Filedref 的表結(jié)構(gòu) (字段項(xiàng)) #2
tag: 09
class_index : 0x0016 ===> 十進(jìn)制 #32
name_and_type_index: 0x0017 ===> #33
CONSTANT_Stringref 的表結(jié)構(gòu) (字符項(xiàng)) #3
tag: 08
class_index : 0x0018 ===> 十進(jìn)制 #34
CONSTANT_Class 的表結(jié)構(gòu) (類(lèi)或接口) #5 #6
tag:07
name_index: 0x001b= 16+11 = #27
CONSTANT_Utf8 的表結(jié)構(gòu) (常量) #7
CONSTANT_NameAndType(字段或方法)
name_index: 常量池索引 ==> 方法名
descriptor_index: 常量 字段描述符或方法描述符 ==> 詳見(jiàn)方法描述符與字段描述符
等等, 這里就不細(xì)化處理了!
javap -v MainTest.class 的方法可以查看..