通路标志
在常量池結束後,緊接着的兩個位元組代表通路标志(access_flags),這個标志用于識别一些類或者接口層次的通路資訊,包括:這個Class是類還是接口,是否定義為public類型,是否定義為abstract類型,如果是類的話是否被聲明為final等,
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iZkRTO5QmZkNWMyIGOlFWO5gjN0ETZjhDNkRmY4UWY08CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
注意:access_flags中一共有16個标志位,此處隻列舉了其中8個。
定義此類:
public final class Test2 {
private static final String NAME="bobo";
private int age = 18;
public void fun1(){
int b = 20;
int c = 30;
int d = b+c+age;
System.out.println(d);
}
}
通路标志對應的資訊
辨別結果的值為0x0031,是多辨別符組成,即由多個辨別符的值累加得來。因為辨別符對應的值的特殊性,值累加後的結果可以唯一定位由哪些辨別符組成,常見的0x0021隻有ACC_SUPER和ACC_PUBLIC的值累加才能得到,而上面的0x0031隻有ACC_SUPER與ACC_FINAL與ACC_PUBLIC的值累加後得到。
類索引,父類索引與接口索引集合
類索引(this_class)和父類索引(super_class)都是一個u2類型的資料,接口索引計數器也是一個u2類型的資料,接口索引集合則是一組u2類型的資料集合,Class檔案中的這幾項資料來确定這個類的繼承關系
類索引
确定目前類的全限定名
父類索引
确定目前類的父類的全限定名。由于java單繼承的原則,是以父類隻可能有一個;由于Object是所有其他類的基類,是以除了Object類本身的super_class為0意外,其餘的所有類的super_class都不為0.
接口索引集合
按照目前類implements(或者目前接口extends)的接口順序,從左往右排列在接口的索引集合中。
public final class Test2 implements Serializable,Runnable{
private static final String NAME="bobo";
private int age = 18;
public void fun1(){
int b = 20;
int c = 30;
int d = b+c+age;
System.out.println(d);
}
@Override
public void run() {
// TODO Auto-generated method stub
}
}
對應的接口索引:
小結:
類索引的直接值,父類索引的直接值,接口索引集合中的索引的直接值,代表的是一個常量池中的索引值,該索引值對應為一個CONSTANT_Class_info , CONSTANT_Class_info 又指向CONSTANT_Utf8_info,CONSTANT_Utf8_info中存儲着全限定名字元串資訊。
參考《深入了解Java虛拟機》