(三)字节码层面理解 class 类文件结构

165 阅读2分钟

Ciqah16DCV2AOOPvAAB-G25Eh54563.png


class 类文件
  1. 为了让 Java 语言具有良好的跨平台能力
  2. 只要安装了虚拟机都可以直接运行字节码类文件(.class文件)
  3. 解除了 Java 虚拟机和 Java 语言之间的耦合
  4. 是Java 虚拟机支持更多语言的桥梁

class 文件数据结构

class 文件里只有2种数据结构:无符号数和表

1. 无符号数

属于基本的数据类型,以 u1、u2、u4、u8 来分别代表 1 个字节、2 个字节、4 个字节和 8 个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者字符串(UTF-8 编码)

2.表

表是由多个无符号数或者其他表作为数据项构成的复合数据类型,class文件中所有的表都以“_info”结尾。其实,整个 Class 文件本质上就是一张表

Cgq2xl6DCV2AZUxwAAA_iliDrpk482.png


class 文件结构

Ciqah16DCV2AZWUrAABDap0K974041.png

  1. 无符号数和表是组成class 文件结构各个部分的元素
  2. 各结构按顺序紧密的从前向后排列,之间不留间隙

当 JVM 加载某个 class 文件时,JVM 就是根据上图中的结构去解析 class 文件,加载 class 文件到内存中,并在内存中分配相应的空间。具体某一种结构需要占用大多空间,可以参考下图:

Cgq2xl6DCV2AehqNAAD5VToVKKE770.png

魔数 magic number

Cgq2xl6DCV2Afn7BAAAXOY5BQb4173.png

是 class 文件的标志, 在 class 文件开头的四个字节固定的值(0xCA,0xFE,0xBA,0xBE), 决定是否能被JVM 识别或加载

版本号

Ciqah16DCV6AYt6iAAAXNBPDSYI774.png

前两个字节 0000 代表次版本号,后两个字节 0034 是主版本号,对应的十进制值为 52,也就是说当前 class 文件的主版本号为 52,次版本号为 0。所以综合版本号是 52.0,也就是  jdk1.8.0

常量池
  1. 常量池中的每一项都是一个表
  2. 常量池中保存了类的各种相关信息(类和父类的名称、类中的方法名、参数名称、参数类型等)

常量池中的每一项都是一个表,其项目类型共有 14 种,如下表所示:

Cgq2xl6DCV6AcrLKAAIl1RRQwuM068.png