天天看點

Class檔案結構介紹[通路标志,類索引,父類索引,接口索引集合]

通路标志

 在常量池結束後,緊接着的兩個位元組代表通路标志(access_flags),這個标志用于識别一些類或者接口層次的通路資訊,包括:這個Class是類還是接口,是否定義為public類型,是否定義為abstract類型,如果是類的話是否被聲明為final等,

Class檔案結構介紹[通路标志,類索引,父類索引,接口索引集合]

注意: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);
    }
}      

通路标志對應的資訊

Class檔案結構介紹[通路标志,類索引,父類索引,接口索引集合]

 辨別結果的值為0x0031,是多辨別符組成,即由多個辨別符的值累加得來。因為辨別符對應的值的特殊性,值累加後的結果可以唯一定位由哪些辨別符組成,常見的0x0021隻有ACC_SUPER和ACC_PUBLIC的值累加才能得到,而上面的0x0031隻有ACC_SUPER與ACC_FINAL與ACC_PUBLIC的值累加後得到。

類索引,父類索引與接口索引集合

 類索引(this_class)和父類索引(super_class)都是一個u2類型的資料,接口索引計數器也是一個u2類型的資料,接口索引集合則是一組u2類型的資料集合,Class檔案中的這幾項資料來确定這個類的繼承關系

類索引

 确定目前類的全限定名

Class檔案結構介紹[通路标志,類索引,父類索引,接口索引集合]
Class檔案結構介紹[通路标志,類索引,父類索引,接口索引集合]

父類索引

 确定目前類的父類的全限定名。由于java單繼承的原則,是以父類隻可能有一個;由于Object是所有其他類的基類,是以除了Object類本身的super_class為0意外,其餘的所有類的super_class都不為0.

Class檔案結構介紹[通路标志,類索引,父類索引,接口索引集合]

接口索引集合

 按照目前類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
        
    }
}      

對應的接口索引:

Class檔案結構介紹[通路标志,類索引,父類索引,接口索引集合]

小結:

 類索引的直接值,父類索引的直接值,接口索引集合中的索引的直接值,代表的是一個常量池中的索引值,該索引值對應為一個CONSTANT_Class_info , CONSTANT_Class_info 又指向CONSTANT_Utf8_info,CONSTANT_Utf8_info中存儲着全限定名字元串資訊。

參考《深入了解Java虛拟機》