aspose.info
ZH

类 - Java 类文件格式

更新于

什么是类文件?

Java 中的类文件 是由 Java 虚拟机 (JVM) 实际执行的 .java 类的编译输出。类文件可以单独执行,也可以作为 JAR 文件的一部分与其他包文件一起作为捆绑包执行。这些可以使用命令行界面中的 javac 命令创建。一些 Java IDE,如 Eclipse 和 NetBeans 提供从项目的 Java 创建 .class 输出文件文件。

类文件格式

Java 类文件由字节码组成,字节码是 JVM 运行的中间代码。类文件由 8 位字节流组成,多字节数据项始终以大端顺序存储。

类文件结构

类文件结构如下图所示。

ClassFile {
    u4             magic;
    u2             minor_version;
    u2             major_version;
    u2             constant_pool_count;
    cp_info        constant_pool[constant_pool_count-1];
    u2             access_flags;
    u2             this_class;
    u2             super_class;
    u2             interfaces_count;
    u2             interfaces[interfaces_count];
    u2             fields_count;
    field_info     fields[fields_count];
    u2             methods_count;
    method_info    methods[methods_count];
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

在哪里:

  • u1 = 无符号单字节数量
  • u2 = 无符号的两字节数量
  • u4 = 无符号四字节数量

.class 文件结构的详细信息以及 Oracle 类文件格式 中的说明,可以参考供开发者参考。这些字段的摘要如下。

  • magic - 魔法项提供标识类文件格式的幻数;它的值是 0xCAFEBABE。
  • minor_version, major_version - 次要版本和主要版本项的值是这个类文件的次要和主要版本号。
  • constant_pool_count - constant_pool_count 项的值等于 constant_pool 表中的条目数加一。如果 constant_pool 索引大于零且小于 constant_pool_count,则认为它是有效的,long 和 double 类型的常量除外。
  • constant_pool[] - constant_pool 是一个结构表(第 4.4 节),表示在 ClassFile 结构及其子结构中引用的各种字符串常量、类和接口名称、字段名称和其他常量。每个 constant_pool 表条目的格式由其第一个“标记"字节指示。
  • access_flags - access_flags 项的值是标志的掩码,用于表示对此类或接口的访问权限和属性。
  • this_class - this_class 项的值必须是 constant_pool 表的有效索引。
  • super_class - 对于一个类,super_class 项的值要么必须为零,要么必须是 constant_pool 表的有效索引。
  • interfaces_count - interfaces_count 项的值给出了此类或接口类型的直接超接口的数量。
  • interfaces[] - interfaces 数组中的每个值都必须是 constant_pool 表的有效索引。
  • fields_count - fields_count 项的值给出了字段表中 field_info 结构的数量。
  • fields[] - 字段表中的每个值都必须是一个 field_info 结构,给出此类或接口中字段的完整描述。
  • methods_count - methods_count 项的值给出了方法表中 method_info 结构的数量。
  • methods[] - 方法表中的每个值都必须是一个 method_info 结构,提供此类或接口中方法的完整描述。如果在 method_info 结构的 access_flags 项中没有设置 ACC_NATIVE 和 ACC_ABSTRACT 标志,则还提供实现该方法的 Java 虚拟机指令。
  • attributes_count - attributes_count 项的值给出了此类的属性表中的属性数(第 4.7 节)。
  • attributes[] - 属性表的每个值都必须是一个 attribute_info 结构。

参考

另请参阅