6.3.3 访问标志

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

figure_0192_0085

access_flags中一共有16个标志位可以使用,当前只定义了其中8个[1],没有使用到的标志位要求一律为0。以代码清单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这6个标志应当为假,因此它的access_flags的值应为:0x0001|0x0020=0x0021。从图6-5中可以看出,access_flags标志(偏移地址:0x000000EF)的确为0x0021。

figure_0193_0086

图 6-5 access_flags标志

[1]在Java虚拟机规范中,只定义了开头5种标志。JDK 1.5中增加了后面3种。这些标志为在JSR-202规范中声明,是对《Java虚拟机规范(第2版)》的补充。本书介绍的访问标志以JSR-202规范为准。