访问标志:常量池后的2个字节代表访问标志(access _flags),用于识别类或接口层次访问信息:
- 这个class 是类还是接口
- 是否定义为public 类型
- 是否定义为abstract类型
- 如类的话,是否被声明为 final
类型 | 名称 | 数量 |
u2 | access_flags | 1 |
u2 | this_class | 1 |
其他省略。。。 |
标志名称 | 标志值 | 含 义 |
ACC_PUBLIC | 0x0001 | 是否为public 类型 |
ACC_FINAL | 0x0010 | 是否被声明为 final 只有类可设置 |
ACC_SUPER | 0x0020 | |
ACC_INTERFACE | 0x0200 | 标识这是一个接口 |
ACC_ABSTRACT | 0x0400 | 是否为abstract 类型,对于接口或抽象类,此标志真其他假 |
ACC_SYNTHETIC | 0x1000 | 标识这个类并非由用户代码产生 |
ACC_ANNOTATION | 0x2000 | 标识这是一个注解 |
类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类全限定名,由于java语言不允许多继承,所以父类索引只有一个,除了java.lang.Object 外,所有的java 类都有父类,因此除了 java.lang.Object外所有java类的父类索引都不为0。
接口索引集合用来描述这个类实现了哪些接口,这些被实现的接口将按implements关键字(如这个class文件表示的是一个接口,则应当是extends关键字)后的接口顺序从左到右排列在接口索引集合中类索引,父类索引和接口索引集合都按顺序在访问标志后,类索引和父类索引,用两个u2类型的索引值表示,它们各自指向一个类型为CONSTANT_Class_info 的类描述符常量,通过CONTANT_Class_info类型的常量中的索引值可以找到定义在CONSTANT_Utf8_info类型的常量中的全限定名字符串。
范例
public class Demo1{
private int m;
public int inc() {
return m + 1;
}
}
如上例,因此它的ACC_PUBLIC,ACC_SUPER标志为真,而ACC_FINAL,ACC_INTERFACE,ACC_ABSTRACT等标志都为假,它的access_flags值:0x0001=0x0021,| (按位或)