常量池计数器
这里的U2 标识常量池的大小 0x0023 十进制数为32+3=35
常量池计数器后面是常量池 (是一个表结构)
常量池的长度是 35-1 =34 即常量池的计数-1 这里共有34项
每一项都是表结构,
常量池主要是存储字符串常量,类,接口名,字段名和其他常量
java虚拟机就是依赖这些常量池中的表结构进行运行
常量池中项(cp_info)的结构
项通用结构:
[图片上传失败...(image-2837bd-1607741032471)]
ps 这里的 info[] 只是一个结构的概况,不是真实的结构, 具体的结构取决于tag的值
tag 为无符号数 (有14种项类型)
image image
常量池中34项的第一项的tag=10 对应到tag项说明中常量类型为 CONSTANT_Methodref
简单翻译是 方法常量引用类型
每一个类型都有其特有的表结构
CONSTANT_Methodref 的表结构(方法项) 这里是#1
image这里显示是占据了5个U1, 这个结构就是cp_info的一种具像表示 截图如下:
image
0x0006 表示的是类索引 十进制表示为 #6
0x0015 表示的是名称或者类型索引 十进制表示为 #21
ps: 可以通过java -p MainTest.class 来显示
CONSTANT_Filedref 的表结构 (字段项) #2
image imagetag: 09
class_index : 0x0016 ===> 十进制 #32
name_and_type_index: 0x0017 ===> #33
CONSTANT_Stringref 的表结构 (字符项) #3
image imagetag: 08
class_index : 0x0018 ===> 十进制 #34
CONSTANT_Class 的表结构 (类或接口) #5 #6
imageimage
tag:07
name_index: 0x001b= 16+11 = #27
CONSTANT_Utf8 的表结构 (常量) #7
image image image imageCONSTANT_NameAndType(字段或方法)
imagename_index: 常量池索引 ==> 方法名
descriptor_index: 常量 字段描述符或方法描述符 ==> 详见方法描述符与字段描述符
等等, 这里就不细化处理了!
javap -v MainTest.class 的方法可以查看..
image
网友评论