java class类文件结构解析(2)访问标志,类索引,父类索引,接口索引集合

当常量池解析完成之后,随之而来的就是访问标志

访问标志用于标记当前类的类和接口层次的信息,用人话来说就是标记你这个类是个啥,是不是public修饰啊,是不是接口啊,是不是注解啊,下面是访问标志的表

标志名称 标记含义
acc_public 0x0001 标记是否为public修饰
acc_final 0x0010 标记是否为final修饰
acc_super 0x0020 默认为真,为了区分该类是否为jdk1.02前的编译的类,兼容性处理
acc_interface 0x0200 标记是否为接口
acc_abstract 0x0400 标记是否为抽象类,注意,若类为接口此处也为真
acc_synthetic 0x1000 标记是否为用户代码产生
acc_annotation 0x2000 标记是否为注解
acc_enum 0x4000 标记是否为枚举

那么这到底是啥玩意呢,举个栗子

  • 假设我这个类是一个public修饰的抽象类,用jdk9编译的(以下默认为jdk9)
    那么这个类的标志位应该为
  • 0001(public修饰) + 0400(抽象类) + 0020(jdk1.02之后编译的类) = 0421
  • 同理,如果这个类是一个public,final修饰的普通类,那么这个类的标志位应该为
  • 0001(public修饰) + 0010(final修饰) + 0020(jdk1.02之后编译的类) = 0031

访问标志之后的6字节就是该类的类索引父类索引,接口索引集合

我的索引为00 03 00 04 00 00,分别对应类索引为常量池第3个值,父索引为常量池第4个值,没有接口索引集合,进入javap查看
java class类文件结构解析(2)访问标志,类索引,父类索引,接口索引集合
显然,我这个类是一个继承自object的名叫testclass的类,加上上面的访问标志的信息(我的访问标记为21),可得这是一个继承自 object 叫 testclass 的 public 修饰的由jdk1.02之后的jdk编译的类