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。
最新評論