当常量池解析完成之后,随之而来的就是访问标志
访问标志用于标记当前类的类和接口层次的信息,用人话来说就是标记你这个类是个啥,是不是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查看
显然,我这个类是一个继承自object的名叫testclass的类,加上上面的访问标志的信息(我的访问标记为21),可得这是一个继承自 object 叫 testclass 的 public 修饰的由jdk1.02之后的jdk编译的类