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。