返回

Class文件结构解析(上):揭开Java字节码的奥秘

后端

引言

在Java的世界中,Class文件扮演着至关重要的角色,它是Java程序的编译结果,也是Java虚拟机(JVM)执行的基础。Class文件包含了Java程序中所有必需的信息,包括类名、方法名、字段名、字节码指令等。只有将Java源代码编译成Class文件,Java程序才能被JVM识别并执行。

Class文件结构

Class文件采用了一种称为“Java字节码”的中间语言来表示。Java字节码是一种紧凑、高效的二进制格式,它可以被不同平台的JVM执行。Class文件由以下几个主要部分组成:

  • 魔数(Magic Number) :魔数是Class文件的第一个字节,它是一个固定值0xCAFEBABE。魔数的作用是标识该文件是一个合法的Class文件。
  • 版本号(Version Number) :版本号占两个字节,它标识了该Class文件的版本。当前Java版本为Java 17,对应的版本号为59.0。
  • 常量池(Constant Pool) :常量池是一个表,它存储了Class文件中使用的各种常量,包括字符串常量、数字常量、类名常量、方法名常量、字段名常量等。
  • 字段表(Fields Table) :字段表是一个表,它存储了类中声明的所有字段。每个字段表项包含字段名、字段类型、字段访问标志等信息。
  • 方法表(Methods Table) :方法表是一个表,它存储了类中声明的所有方法。每个方法表项包含方法名、方法参数类型、方法返回值类型、方法访问标志等信息。
  • 属性表(Attributes Table) :属性表是一个表,它存储了类或方法的各种属性。属性表项的类型有很多种,包括源文件名称、行号表、异常表、代码属性等。

Class文件结构解析(上)

在本文中,我们将重点介绍Class文件结构中的前四个部分:魔数、版本号、常量池、字段表。

魔数

魔数是Class文件的第一个字节,它是一个固定值0xCAFEBABE。魔数的作用是标识该文件是一个合法的Class文件。

版本号

版本号占两个字节,它标识了该Class文件的版本。当前Java版本为Java 17,对应的版本号为59.0。

常量池

常量池是一个表,它存储了Class文件中使用的各种常量,包括字符串常量、数字常量、类名常量、方法名常量、字段名常量等。

常量池的结构如下:

常量池 {
    常量池计数器
    常量池项表
}

常量池计数器是一个无符号16位整数,它表示常量池项表的长度。常量池项表是一个表,它存储了各种类型的常量项。

常量项的类型有很多种,包括:

  • Utf8Info常量项 :Utf8Info常量项存储了一个UTF-8编码的字符串。
  • IntegerInfo常量项 :IntegerInfo常量项存储了一个32位有符号整数。
  • FloatInfo常量项 :FloatInfo常量项存储了一个32位IEEE 754浮点数。
  • LongInfo常量项 :LongInfo常量项存储了一个64位有符号整数。
  • DoubleInfo常量项 :DoubleInfo常量项存储了一个64位IEEE 754浮点数。
  • ClassInfo常量项 :ClassInfo常量项存储了一个类或接口的符号引用。
  • StringInfo常量项 :StringInfo常量项存储了一个字符串的符号引用。
  • FieldInfo常量项 :FieldInfo常量项存储了一个字段的符号引用。
  • MethodInfo常量项 :MethodInfo常量项存储了一个方法的符号引用。
  • NameAndTypeInfo常量项 :NameAndTypeInfo常量项存储了一个字段或方法的名字和类型信息。

字段表

字段表是一个表,它存储了类中声明的所有字段。每个字段表项包含字段名、字段类型、字段访问标志等信息。

字段表的结构如下:

字段表 {
    字段表计数器
    字段表项表
}

字段表计数器是一个无符号16位整数,它表示字段表项表的长度。字段表项表是一个表,它存储了各种类型的字段表项。

字段表项的类型有很多种,包括:

  • 字段表项 :字段表项存储了一个字段的详细信息,包括字段名、字段类型、字段访问标志、字段初始值等。
  • 枚举表项 :枚举表项存储了一个枚举类型的详细信息,包括枚举类型名、枚举常量表等。
  • 注解表项 :注解表项存储了一个注解类型的详细信息,包括注解类型名、注解元素表等。

结语

在本文中,我们介绍了Class文件结构的前四个部分:魔数、版本号、常量池、字段表。在下一篇