字节码结构
https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html
- magic:魔数,用于标识当前 class 的文件格式,JVM 可据此判断该文件是否可以被解析,目前固定为 0xCAFEBABE
- major_version:主版本号。
- minor_version:副版本号,这两个版本号用来标识编译时的 JDK 版本,常见的一个异常比如 Unsupported major.minor version 52.0 就是因为运行时的 JDK 版本低于编译时的 JDK 版本(52 是 Java 8 的主版本号)
- constant_pool_count:常量池计数器,等于常量池中的成员数加 1。
- constant_pool:常量池,是一种表结构,包含 class 文件结构和子结构中引用的所有字符串常量,类或者接口名,字段名和其他常量。
- access_flags:表示某个类或者接口的访问权限和属性。
- this_class:类索引,该值必须是对常量池中某个常量的一个有效索引值,该索引处的成员必须是一个 CONSTANT_Class_info 类型的结构体,表示这个 class 文件所定义的类和接口。
- super_class:父类索引
- interfaces_count:接口计数器,表示当前类或者接口直接继承接口的数量。
- interfaces:接口表,是一个表结构,成员同 this_class,是对常量池中 CONSTANT_Class_info 类型的一个有效索引值。
- fields_count:字段计数器,当前 class 文件所有字段的数量
- fields:字段表,是一个表结构,表中每个成员必须是 filed_info 数据结构,用于表示当前类或者接口的某个字段的完整描述,但它不包含从父类或者父接口继承的字段
- methods_count:方法计数器,表示当前类方法表的成员个数。
- methods:方法表,是一个表结构,表中每个成员必须是 method_info 数据结构,用于表示当前类或者接口的某个方法的完整描述。
- attributes_count:属性计数器,表示当前 class 文件 attributes 属性表的成员个数。
- attributes:属性表,是一个表结构,表中每个成员必须是 attribute_info 数据结构,这里的属性是对 class 文件本身,方法或者字段的补充描述,比如 SourceFile 属性用于表示 class 文件的源代码文件名。