美文网首页
JVM 字节码-02 常量池学习

JVM 字节码-02 常量池学习

作者: 丿易小易 | 来源:发表于2020-12-13 11:18 被阅读0次
    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 常量池学习

          本文链接:https://www.haomeiwen.com/subject/lxuegktx.html