【JVM】class文件結構2——類索引、超類索引與接口表索引

1、類索引

類索引緊隨在類訪問標記之後,佔兩個字節,裏面存儲一個指向常量池的一個索引,用於指出該class文件的全限定名。

以下面這個簡單的java類爲例:

package com.yang.testFlag;

public class Main {

}

其16進制數據:

可以看到,類索引爲0x0002,代表指向常量池的第二個常量項,而常量池內容爲:

第二個常量項又指向第11個常量項,即“com/yang/testFlag/Main”字符串,即這個類索引能告訴我們,該class文件的全限定名。


2、超類索引

超類索引緊隨在類索引之後,也是佔兩個字節,同樣存儲一個指向常量池的索引,用於指出該類的父類全限定名。

可以看到,超類索引爲0x0003,找到#3,再找到#12,可以得到該類的父類爲java/lang/Object,Object類是所有類的一個隱形父類。有關Object類裏面的方法,可以參考我的另外一篇文章Object類的方法簡談

如果Main類繼承的是Thread類的話,那麼此時超類索引指向的常量池項的值爲java/lang/Thread。


3、接口表索引

每一個類都只能繼承一個直接父類,卻可以實現多個接口,接口表索引則是一個指向常量池中所有接口全限定名的一個容器。

接口表索引包含接口計數以及接口索引,接口計數緊隨着超類索引,然後接口索引緊隨着接口計數。

以下面的代碼爲例:

package com.yang.testFlag;

import java.io.Serializable;

public class Main implements Runnable, Serializable {

    @Override
    public void run() {
        
    }
}

可以看到接口計數爲0x0002,也就是有兩個接口。第2個接口的索引爲0x0004,第2個接口的索引爲0x0005。

由常量池,我們可以看到接口表索引內的兩個接口的全限定名分別爲java/lang/Runnable以及java/io/Serializable。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章