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。