一、访问和修饰标志
access_flags ( 访问和修饰标志 ) : 常量池后面的 2 22 位就是 访问和修饰标志 ; 访问 和 修饰标志 00 21 ; 表示 类 / 接口 的 访问权限 / 基础属性 ;
根据下面两个表解读 访问和修饰标志 ;
访问和修饰标志 00 21 ; 这是根据上述表格中的值进行位运算得到的 ;
这是 ACC_SUPER 0x0200 和 ACC_PUBLIC 0x0001 两个值进行或运算 , 得出的值 0x0021 ;
在 字节码附加信息 中的 次版本号 , 主版本号 , 后跟着的就是 访问和修饰标志 ACC_PUBLIC, ACC_SUPER , 就是根据这里的 2 22 个字节的信息得出的 ;
public class Student minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPER
二、类索引
this_class ( 类索引 ) : 在 access_flags ( 访问和修饰标志 ) 后面的 2 22 字节就是 类索引 ; 这个值必须是 常量池 中的有效索引值 , 并且还要是 CONSTANT_Class_Info 类型的常量 ;
值为 00 03 , 也就是对应常量池中的 #3 常量 ;
常量池中的 #3 索引是 Student 类 ; 参考 【Java 虚拟机原理】Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | info[] | 完整分析字节码文件中的常量池二进制数据 ) 二、常量池字节码文件分析 3、常量池 #3 常量分析 章节 ;
Constant pool: #1 = Methodref #4.#17 // java/lang/Object."<init>":()V #2 = Fieldref #3.#18 // Student.name:Ljava/lang/String; #3 = Class #19 // Student
后面的字节码数据, 基本都是指向了常量池中的一些引用 ;
三、父类索引
super_class ( 父类索引 ) : 在 this_class ( 类索引 ) 后面的 2 22 字节就是 父类索引 ; 这个值必须是 常量池 中的有效索引值 , 并且还要是 CONSTANT_Class_Info 类型的常量 ;
值为 00 04 , 也就是对应常量池中的 #3 常量 ;
常量池中的 #4 索引是 java/lang/Object 类 ; 参考 【Java 虚拟机原理】Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | info[] | 完整分析字节码文件中的常量池二进制数据 ) 二、常量池字节码文件分析 4、常量池 #4 常量分析 章节 ;
Constant pool: #4 = Class #20 // java/lang/Object
后面的字节码数据, 基本都是指向了常量池中的一些引用 ;