【JVM】class文件结构2——类索引、超类索引与接口表索引

26 篇文章 10 订阅

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunAlwaysOnline

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值