访问标识(access_flag)
- 在常量池后,紧跟着访问标记,标记使用两个字节表示,用于识别一些类或接口层次的访问信息,包括这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型,如果是类的话,是否声明为final等,各种访问标记如下:
- 类的访问权限通常为ACC_开头的常量
- 每一种类型的表示都是通过设置访问标记的32位中的特定位来实现的,比如,若是public final的类,则该标记为ACC_PUBLIC | ACC_FINAL
- 使用ACC_SUPER可以让类更准确地定位到父类的方法super.method(),现代编译器都会设置并且使用这个标记
- 带有ACC_INTERFACE标志的class文件表示是接口不是类,反之则表示是类而不是接口
- 如果一个class文件被设置了ACC_INTERFACE标志,那么同时也得设置ACC_ABSTRACT标志,同时不能设置ACC_FINAL、ACC_SUPER或ACC_ENUM标志
- 如果没有设置ACC_INTERFACE标志,那么这个class文件可以具有上表中除ACC_ANNOTATION外的其他所有标志,当然ACC_FINAL和ACC_ABSTRACT这类互斥的标志除外,这两个标志不能同时设置
- ACC_SUPER标志用于标志用于确定类或接口里面的invokespecial指令使用的哪一种执行语义,针对Java虚拟机指令集的编译器都应设置这个标志,对于Java SE8及后续版本来说,无论class文件中这个标志的实际值是什么,也不管class文件的版本是多少,Java虚拟机会为每个class文件均设置ACC_SUPER标志
- ACC_SUPER标志为了向后兼容由旧Java编译器所编译的代码而设计,目前的ACC_SUPER标志在由JDK1.0.2之前的编译器生成的access_flags中没有确定意义,如果设置该标志,oracle的JVM实现会将其忽略
- ACC_SYNTHETIC标志意味着该类或接口是由编译器生成的,而不是由源代码生成的
- 注解类型必须设置为ACC_ANNOTATION标志,如果设置了ACC_ANNOTATION标志,那么也必须设置ACC_INTERFACE标志
- ACC_ENUM标志表明该类或其父类为枚举类型
- 表中没有使用的Access_flags标志为未来扩充预留,这些预留标志在编译器中应该设置为0,