如果你还不了解 Java Class 文件结构,来看看这篇吧

文章首发于【Java天堂】,跟随我探索Java进阶之路!

Class文件是什么

Java Class文件是Java编译器将源代码编译后的二进制表示,它是Java虚拟机(JVM)运行的基础。

Class文件绝大部分内容是在1997年发布的第一版《Java虚拟机规范》中就已经定义好的,后续20多年的发展过程当中Java经历了大大小小无数个版本的迭代,加入了很多新的特性,但Class文件的整体结构没什么大的变化,除了支持一些新的特性来扩展内容以外,其他内容在这20多年的时间当中基本上没有变化,这样的设计对于Java语言本身的兼容性和稳定性是大有好处的,不管上层的语言特性如何变化,最终的Class文件变化不大,Java虚拟机只需要按照Class的文件标准来执行就好了。

Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8个字节以上空间的数据项时,则会按照高位在前[插图]的方式分割成若干个8个字节进行存储

文件格式

Java Class 文件采用了一种标准的二进制格式,它由多个部分组成,每个部分都有特定的作用。下面是 Java Class 文件的基本格式:

  • 魔数(Magic Number): Java Class 文件的前4个字节是一个固定的魔数,用于识别文件是否为有效的 Java Class 文件。魔数的值为0xCAFEBABE。
  • 版本信息(Version): 之后的4个字节分别表示 Java 版本号。前两个字节表示主版本号,后两个字节表示次版本号。例如,Java 8 的版本号为52.0。
  • 常量池(Constant Pool): 常量池是 Java Class 文件的一个重要组成部分,它包含了类中使用的常量,如字符串、类名、方法名等。常量池的第一个常量是一个占位符,后续的常- 量都从1开始计数。
  • 访问标志(Access Flags): 访问标志用于描述类或者类的成员的访问级别,如 public、private、protected 等。
  • 类信息(Class Information): 包括类的名称、父类名称、接口列表等。
  • 字段表(Field Table): 字段表用于存储类的成员变量信息,包括字段名、类型等。
  • 方法表(Method Table): 方法表存储了类的方法信息,包括方法名、参数列表、返回类型等。
  • 属性表(Attribute Table): 属性表用于存储额外的信息,如代码行号、异常表、注解等。

示例代码

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

编译HelloWorld.java文件可以得到HelloWorld.class文件

javac HelloWorld.java

因为.class文件是编译后的二进制文件,需要使用特定的工具,才能看到对应的内容。可以使用winhex这个工具打开文件,如下图所示

可以看到前面8个字节,分别表示魔数、Class文件的版本号。后面依次是常量池、访问标志、类信息、字段表、方法表、属性表

如果有兴趣,可以详细研究一下各个部分的内容和存储方式,对于理解整个Java文件运行的过程可以起到一个整体的认识

本文由博客一文多发平台 OpenWrite 发布!

热门相关:绝天武帝   从港综签到成为传说   我真不是学神   千夫斩   攻略初汉