本文摘自 Android 工程师进阶 34 讲:第03讲:字节码层面分析 class 类文件结构

Java 虚拟机当初被设计出来的目的就不单单是只运行 Java 这一种语言。目前 Java 虚拟机已经可以支持很多除 Java 语言以外的其他语言了,如 Groovy、JRuby、Jython、Scala 等。之所以可以支持其他语言,是因为这些语言经过编译之后也可以生成能够被 JVM 解析并执行的字节码文件。而虚拟机并不关心字节码是由哪种语言编译而来的。如下图所示:
📻 class 文件结构 - 图1

主要结构

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

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

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

📻 class 文件结构 - 图2
可以看出,在一张表中可以包含其他无符号数和其他表。

class 文件结构

上一节我们说在 class 文件中只存在无符号数和表这两种数据结构。而这些无符号数和表就组成了 class 中的各个结构。这些结构按照 预先规定好的顺序 紧密的从前向后排列,相邻的项之间没有任何间隙。如下图所示:
📻 class 文件结构 - 图3

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

📻 class 文件结构 - 图4

看到这里你可能会有点概念混淆,分不清无符号数、表格以及上面的结构是什么关系。其实可以举一个简单的例子:人类的身体是由 H、O、C、N 等元素组成的。但是这些元素又是按照一定的规律组成了人类身体的各个器官。class 文件中的无符号数和表格就相当于人类身体中的 H、O、C、N 等元素,而 class 结构图中的各项结构就相当于人类身体的各个器官。并且这些器官的组织顺序是有严格顺序要求的,毕竟眼睛不能长在屁股上。