当前位置 博文首页 > 阳阳的博客:【JVM】class文件结构2——类索引、超类索引与接口

    阳阳的博客:【JVM】class文件结构2——类索引、超类索引与接口

    作者:[db:作者] 时间:2021-08-04 12:02

    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。

    cs