6.3.3 访问标志

6.3.3 访问标志

在常量池结束之后,紧接着的2个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract 类型;如果是类的话,是否被声明为final;等等。具体的标志位以及标志的含义见表6-7。

表6-7 访问标志

image-20211118134802563

access_flags中一共有16个标志位可以使用,当前只定义了其中9个[^1],没有使用到的标志位要求一律为零。以代码清单6-1中的代码为例,TestClass是一个普通Java类,不是接口、枚举、注解或者模块,被public关键字修饰但没有被声明为final和abstract,并且它使用了JDK 1.2之后的编译器进行编译,因此它的ACC_PUBLIC、ACC_SUPER标志应当为真,而ACC_FINAL、ACC_INTERFACE、 ACC_ABSTRACT、ACC_SYNTHETIC、ACC_ANNOTATION、ACC_ENUM、ACC_MODULE这七个标志应当为假,因此它的access_flags的值应为:0x0001|0x0020=0x0021。从图6-5中看到,access_flags 标志(偏移地址:0x000000EF)的确为0x0021。

image-20211118202639160

图6-5 access_flags标志

[^1]: 在原始的《Java虚拟机规范》初版中,只定义了开头5种标志。JDK 5中增加了后续3种。这些标志 为在JSR-202规范之中声明,是对《Java虚拟机规范》第2版的补充。JDK 9发布之后,增加了第9种。