在常量池结束之后,紧接着的两个字节代表访问呢标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final等。具体的标志位以及标志的含义见下表。
标志名称 标志值 含义 ACC_PUBLIC 0x0001 是否为public类型 ACC_FINAL 0x0010 是否被声明为final,只有类可设置 ACC_SUPER 0x0020 是否允许使用invokespecial字节码指令的新语义,invokespecial指令的语意在JDK 1.0.2发生过改变,为了区别这条指令使用哪种语义,JDK 1.0.2之后编译出来的类的这个标志都必须为真 ACC_INTERFACE 0x0200 标识这是一个接口 ACC_ABSTRACT 0x0400 是否为abstract类型,对于接口或者抽象类来说,此标志值为真,其他类值为假 ACC_SYNTHETIC 0x1000 标识这个类并非由用户代码产生的 ACC_ANNOTATION 0x2000 标识这是一个注解 ACC_ENUM 0x4000 标识这是一个枚举
access_flags中一共有16个标志位可以使用,当前只定义了其中8个,没有使用到的标志位要求一律为0.以下面代码为例,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。从下图可以看出,access_flags标志(偏移地址:0x000000EF)的确为0x0021。
public class TestClass {
private int m;
public int inc() {
return m + 1;
}
}