Jvm(37),class文件结构-----类索引父类索引接口索引集合

Posted qingruihappy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jvm(37),class文件结构-----类索引父类索引接口索引集合相关的知识,希望对你有一定的参考价值。

技术分享图片

 

讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了。现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志、类索引、父类索引、接口索引集合。

1. 访问标志、类索引、父类索引、接口索引集合 在class文件中的位置

技术分享图片

好,让我们来一一击破它们,看看它们到底是什么东西。

3. 类索引(this_class)是什么?

我们知道一般情况下一个Java类源文件经过JVM编译会生成一个class文件,也有可能一个Java类源文件中定义了其他类或者内部类,这样编译出来的class文件就不止一个,但每一个class文件表示某一个类,至于这个class表示哪一个类,便可以通过 类索引 这个数据项来确定。JVM通过类的完全限定名确定是某一个类。

类索引的作用,就是为了指出class文件所描述的这个类叫什么名字。

类索引紧接着访问标志的后面,占有两个字节,在这两个字节中存储的值是一个指向常量池的一个索引,该索引指向的是CONSTANT_Class_info常量池项,

技术分享图片

以上面定义的Simple.class 为例,如下图所示,查看他的类索引在什么位置和取什么值。

技术分享图片

由上可知,它的类索引值为0x0001,那么,它指向了常量池中的第一个常量池项,那我们再看一下常量池中的信息。使用javap -v Simple,常量池中有以下信息:

技术分享图片

可以看到常量池中的第一项是CONSTANT_Class_info项,它表示一个"com/louis/jvm/Simple"的类名。即类索引是告诉我们这个class文件所表示的是哪一个类。

技术分享图片

  1. 父类索引(super_class)是什么?

Java支持单继承模式,除了java.lang.Object 类除外,每一个类都会有且只有一个父类。class文件中紧接着类索引(this_class)之后的两个字节区域表示父类索引,跟类索引一样,父类索引这两个字节中的值指向了常量池中的某个常量池项CONSTANT_Class_info,表示该class表示的类是继承自哪一个类。

技术分享图片

  1. 接口索引集合(interfaces)是什么?

一个类可以不实现任何接口,也可以实现很多个接口,为了表示当前类实现的接口信息,class文件使用了如下结构体描述某个类的接口实现信息:

技术分享图片

由 于 类 实 现 的 接 口 数 目 不 确 定 , 所 以 接 口 索 引 集 合 的 描 述 的 前 部 分 叫 做 接 口 计 数 器(interfaces_count),接口计数器占用两个字节,其中的值表示着这个类实现了多少个接口,紧跟着接口计数器的部分就是接口索引部分了,每一个接口索引占有两个字节,接口计数器的值代表着后面跟着的接口索引的个数。接口索引和类索引和父类索引一样,其内的值存储的是指向了常量池中的常量池项的索引,表示着这个接口的完全限定名。

举例:

定义一个Worker接口,然后类Programmer实现这个Worker接口,然后我们观察Programmer的接口索引集合是怎样表示的。

/**

  • Worker 接口类
  • @author luan louis

*/

public interface Worker{

    public void work();

}

package com.louis.jvm; public class Programmer implements Worker {

    @Override

    public void work() {

         System.out.println("I‘m Programmer,Just coding....");

    }

}

 

技术分享图片

以上是关于Jvm(37),class文件结构-----类索引父类索引接口索引集合的主要内容,如果未能解决你的问题,请参考以下文章

深入理解JVM读书笔记: Class类文件结构

JVM-class文件完全解析-字段表集合

深入理解JVM读书笔记: Class类文件结构

深入理解JVM读书笔记: Class类文件结构

JVM -虚拟机执行子系统

JVM虚拟机---深入理解Class中访问标志类索引父类索引接口索引