少于 1 分钟阅读 次阅读

  • .class 文件是 Java 编译后的中间代码
  • 它实现了 Java 的平台无关性
  • 在运行时由 JVM 解释执行或 JIT 编译为机器码
  • 是 Java 生态系统的基础,支撑了 Java 的跨平台特性

基本概念

1. 文件生成

  • 当 Java 源代码文件(.java 文件)被 javac 编译器编译时,会生成对应的 .class 文件
  • 每个类都会生成一个独立的 .class 文件
  • 示例:
    // HelloWorld.java
    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println("Hello, World!");
        }
    }
    
    javac HelloWorld.java  // 编译
    // 生成 HelloWorld.class
    

2. 文件内容结构

.class 文件包含以下部分:

部分 描述
魔数(Magic Number) 标识 Java 类文件的格式(0xCAFEBABE)
版本信息 主版本和次版本号,标识 JDK 版本
常量池(Constant Pool) 字符串、类名、方法名、字段名等常量
访问标志 类的访问权限(public、final、abstract 等)
类信息 当前类、父类、接口信息
字段表 类的字段信息
方法表 类的方法信息(包括字节码指令)
属性表 附加属性(如源代码文件名、行号表等)

3. 字节码格式

  • .class 文件是平台无关的二进制格式
  • 使用 JVM 指令集(字节码指令),而不是特定 CPU 的机器码
  • 可以使用 javap 工具查看字节码内容:
    javap -c HelloWorld.class
    

关键特点

1. 平台无关性

  • .class 文件可以在任何安装了 JVM 的平台上运行
  • 实现 “一次编译,到处运行”

2. 中间表示

  • 不是机器码,而是 JVM 可理解的中间代码
  • 比源代码更紧凑,但比机器码更抽象

3. 类加载机制

JVM 通过类加载器加载 .class 文件:

// 类加载过程示例
1. 加载查找并加载 .class 文件
2. 验证验证字节码的正确性
3. 准备为静态变量分配内存
4. 解析将符号引用转换为直接引用
5. 初始化执行静态初始化代码

查看 .class 文件内容

可以使用vscode插件如jar viewer查看jar包中的class文件,使用java decomplier查看class反编译出的代码。

常见相关概念

概念 描述
JAR 文件 多个 .class 文件的压缩包
WAR/EAR 文件 Web 应用程序和企业应用程序的打包格式
字节码增强 在运行时修改 .class 文件的技术
反编译 .class 文件转换回 .java 源代码

留下评论