JVM 字节码-02 常量池学习

image
image

常量池计数器

这里的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
image

tag: 09
class_index : 0x0016 ===> 十进制 #32
name_and_type_index: 0x0017 ===> #33

CONSTANT_Stringref 的表结构 (字符项) #3

image
image

tag: 08
class_index : 0x0018 ===> 十进制 #34

CONSTANT_Class 的表结构 (类或接口) #5 #6

image

image

tag:07
name_index: 0x001b= 16+11 = #27

CONSTANT_Utf8 的表结构 (常量) #7

image
image
image
image

CONSTANT_NameAndType(字段或方法)

image

name_index: 常量池索引 ==> 方法名
descriptor_index: 常量 字段描述符或方法描述符 ==> 详见方法描述符与字段描述符

image

等等, 这里就不细化处理了!

javap -v MainTest.class 的方法可以查看..

image

你可能感兴趣的:(JVM 字节码-02 常量池学习)