• 03.jvm常量池


    1.常量池总数(存放一堆常量)(第一个可变长的结构)

    //两个字节 u2 constant_pool[constant_pool_count-1] 范围在[1,n-1]
    //第一个位置不存常量,保留保留索引(特殊情况下使用)
    //所以5个常量 范围在 [1,6]中

    2.常量池

     1.jvm指令依赖常量池表中的符号信息()
     2.常量组成(与java常量区别)
          1.字面量Literal(字符串,final的常量值final int final float....)
          2.符号引用 #123
             类与接口的全限定名称top.jamsee.App (包名+类名)
              字段的名称(变量的名称)和 ???描述符
     3.cp_info的展开
       cp_info  constant_pool[constant_pool_count-1] 
      cp_info{
          u1 tag;//标志是哪一种常量
          u1 info[];//
       
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.符号类型各种常量

                     常量类型                       tag
                CONSTANT_Class_info      7   类或接口符号引用
                        Fieldref         9    字段
                        Methodref        10   类中方法
                         InterfaceMethodref 11 接口中方法引用
                         String                       8   字符串类型字面量
                         Integer                     3     整数
                         Float                         4
                         Long                         5
                         Double                      6
                         NameAndType          12 字段与字段类型,方法和方法类型的符号引用
                         Utf8                           1  utf字符串
                         //后面三个是java动态语法的基础,lambda表达式的基础
                        MethodHandle          15  方法处理信息
                        MethodType              16  方法类型
                        InvokeDynamic           18   动态方法调用点
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.常量–>符号表类型–>描述符

    1.字段描述符 (表示类,对象,局部变量的数据类型)

    • B代表 byte
      C代表 char
      D double
      F float
      I int
      J Long
      L ClassName(类的名称) 类的实例
      S short
      Z boolean
      [ reference 代表一个一维数组
      [[ 二维
      V void 没有返回值 例子:
      int a; //描述符是 I
      Ljava/lang/object; //object类型的实例,加包名
      [[[D //表示三维数组double d[][][]

    2.方法描述符(来描述方法的信息)

    • 1.方法名不会描述
      2.this不会描述,由jvm指令描述
      3.类方法和实例方法描述符一样
      例如:
      Object aa(int i,double d,Thread t){} //返回值描述在后面
      (IDLjava/lang/Thread;)Ljava/lang/Object

    5.javap(看二进制已经不满足看到常量的)(java官方给的)(服务器上查看)

    //cmd cd到out目录
    javap -v Stu.Class #输出附加信息,类信息,可以看常量池

    6.另外的一个查看工具idea的插件 jclasslib Bytecode Viewer(初学者看熟悉看javap)

    选中文件 view--> show bytecode
     ------14个常量(有不同数据结构)-------
    
    • 1
    • 2

    7.CONSTANT_Class_info

     CONSTANT_Class_info{
          u1 tag;
         u2 name_index;  //存 #14到14这个utf常量 com/jamsee/app/Stu
      }    //类/接口中(静态块,方法中,抛异常,数组)使用其他类,也会添加到这个常量中(数量变多)
          public void func2() throws Throwable{}
            HashSet[] hashsets=new HashSet[10];//也会放,维度小于255个    //没有实例化不放到常量池,没有new
              HashSet[] hashsets;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    8.符号表实际上是数组的下标 #14像mysql的外键

    9.继承怎么办 //点击常量池,可以选上过滤,可以方便看

    1.常量池只会显示他直接继承的类,不会显示祖宗Object类
    例如: class Teacher extends Person{} #常量池有两个常量,一个是他自己,另外一个是Person
    2.抽象类和类一样
    public abstract class xxx{}
    3.接口(面试题) 也是有Object和自己的全限定名称
    面试题: 接口的父类是不是Object?
    接口没有父类,接口可以多继承IA,IC
    通过extends 可以看出Object不是直接父类(如果是Object,不会显示出来)
    Object在接口里面引用,就是在接口new出来
    interface IA{ Object obj=new Object();}

    10.枚举(也是类)在CONSTANT_Class_info常量查看

      public enum my{
    
       }
       1.有4个常量 
           1.他自己<[Ltop/jamsee/myE;> //(2个) 多一个[ 代表数组
           2..他自己
           3.枚举对象 Enum
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    11.注解

     public @interface aa{ }
         3个常量
      1.自己的包名
      2.Object
      3. 基类
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    gcc 好玩的 builtin 函数
    【RabbitMQ】RabbitMQ的交换机
    GPU 直通 & vGPU:超融合为 GPU 应用场景提供高性能支持
    华为机试HJ9
    博客摘录「 Python面试宝典」2024年2月20日
    Leetcode刷题解析——最大连续1的个数
    HCIP第十三天
    Python传参拷贝问题
    CAUSE: 加载证书时出错PKCS12 key store mac invalid - wrong password
    Notepad++安装插件和配置快捷键
  • 原文地址:https://blog.csdn.net/weixin_47039303/article/details/127870423