【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。

原创文章 193 获赞 651 访问量 122万+

猜你喜欢

转载自blog.csdn.net/qq_33591903/article/details/106057131