Java指Class的学习

[Class文件结构](“Class文件结构 - wade&luffy - 博客园 (cnblogs.com)“)

用二进制软件打开我们的class文件,可以看到这个class文件的二进制文件内容(在这个软件里面他是将二进制数据转化成了十六进制,这是为什么呢因为一个一个字节占用8位,那这8位数据我们可以拆成4和4,然后一个十六进制数用二进制表示要用4个数,所以正好两个十六进制就能表示一个字节,这样可以方便人们阅读)。他的前四个字节代表这个文件的魔术,用来描述这个文件格式信息,比如class文件的魔术是CAFEBABF。然后接着后4个字节代表当前jdk的版本信息。然后接着两位代表常量池常量数量。

img-0

0014对应的10进制就是20。也就代表当前的这个class文件的常量池里面有20个常量。这个我们通过javap命令可以证明:执行命令 javap -v **.class

img-0

这一看到有19个常量+一个特殊常量(就是0这个方便jvm虚拟机来索引用) = 20个常量。

常量池中存放着各种类型的常量,都有自己的类型,并且有自己的存储规范,比如:

  • 字符串常量:以01开头(占一个字节),接着用2个字节表示字符长度,接着就是字符内容。

    比如01 0002 6869 ;0002代表长度为2。所以往后数两位就是字符内容。

  • fieldref类型:以09开头,接着2个字节代表常量所在的class 在两位代表该常量名和类型

  • class类型:以07开头,接着两个字节代表指向utf-8的所引。

img-0img-0img-0
img-0

class文件里面哪些是常量?

上面这张图已经表示了全部的常量类型。一共有12种。

  1. 字面量:比较类似java语言层面的常量概念,比如文本字符串,被声明为final的常量值
  2. 符号引用:属于编译原理方面的概念,包括:
    • 类和接口的全限定名
    • 字段的名称和描述符
    • 方法的名称和描述符