一、概述

前面介绍了class文件,包括魔数、次版本号、主版本号、常量池和访问标志.接下来的就是用于确定这个类的继承关系的类索引(this_class)、父类索引(super_class)与接口索引集合(interfaces)这三项。

类索引、父类索引和接口索引集合都按顺序排列在访问标志之后,类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。由于Java语言不允许多继承,因此父类索引只有一个,除了java.lang.Object之外,所有的Java类都有父类,因此除了Object外,所有Java类的父类索引都不为0。

二、详细描述

类索引和父类索引均是u2类型的数据,它们各自指向一个类型为CONSTANT_Class_info类型的常量,通过CONSTANT_Class_info类型的常量中的索引值可以找到定义在CONSTATN_Utf8_info类型的常量中的全限定名字符串。

接口索引集合用来描述这个类实现了哪些接口,它是一组u2类型的数据的集合,集合中的第一项是接口计数器,表示索引表的容量。如果一个类没有实现任何接口,则该计数器值为0。

索引位置参见下图:

三、案例分析

新建接口:

public interface HelloWord {
}

这里类索引值是0x0001,也就是指向常量池中的第一项,通过查找常量池可知这个类的全限定名是com/csdn/reader/HelloWord。

类索引后的两个字节就是父类索引,同上可查找到父类索引为0x0002,对应于常量池中的第二项:

由于类实现的接口数目不确定,所以接口索引集合的描述的前部分叫做接口计数器(interfaces_count),接口计数器占用两个字节,其中的值表示着这个类实现了多少个接口,紧跟着接口计数器的部分就是接口索引部分了,每一个接口索引占有两个字节,接口计数器的值代表着后面跟着的接口索引的个数。

com.csdn.reader.HelloWord类没有实现任何接口,接口索引值为0。

来个复杂一点的:

public interface HelloWord extends StringBuilderFormattable, Serializable {
}

通过javap来进行分析:

参考资料:

  1. https://www.cnblogs.com/lrh-xl/archive/2016/04/01/5346516.html
  2. https://blog.csdn.net/IT_GJW/article/details/80447947
  3. https://blog.csdn.net/qq_40511966/article/details/94410672

JVM虚拟机-Class文件之类索引、父类索引和接口索引集合相关推荐

  1. JVM虚拟机-Class文件之方法表集合

    一.概述 方法表集合与属性表集合的结构类似,是对方法的修饰符.返回类型.方法名.参数个数.参数类型.方法体的描述集合. 方法表集合的结构是一个类似于数组的结构,JVM在对java文件进行编译时,会将类 ...

  2. JVM虚拟机-Class文件之常量池

    一.常量池的作用 在class文件中的魔数.副版本号.主版本之后,紧接着就是常量池的数据区域了,如下图用红线包括的位置: 常量池可以比喻为Class文件里的资源仓库,它是Class 文件结构中与其他项 ...

  3. JVM虚拟机-Class文件之字段表集合

    一.概述 在接口索引集合后面 的就是字段表集合了.字段表(field_info)用于描述接口或者类中声明的变量.字段包括类级变量以及实例级变量,但是不包括在方法内部声明的局部变量. 二.字段表集合的构 ...

  4. JVM虚拟机-Class文件简介

    一.简介 class文件全名称为Java class文件,class文件径打破了C或者C++等语言所遵循的传统,当编译和连接一个C++程序时,所获得的可执行二进制文件只能在指定的硬件平台和操作系统上运 ...

  5. JVM虚拟机-Class文件之属性表集合

    一.概述 在class文件中,属性表集合包括Java虚拟机预先规范定义的属性以及用户自定义的属性,对于用户自定义的属性,虚拟机加载的时候会自动忽略掉.class文件.字段表.方法表都可以携带自己的属性 ...

  6. JVM虚拟机-Class文件之魔数

    一.魔数之定义 魔数这个词在不同领域代表不同的含义.在计算机领域,魔数有两个含义,一指用来判断文件类型的魔数:二指程序代码中的魔数,也称魔法值. 大多数情况下,我们都是通过扩展名来识别一个文件的类型的 ...

  7. JVM虚拟机-Class文件之访问标志

    一.访问标志的概念 常量池结束之后,紧接着的两个字节代表访问标志,这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是接口还是类:是否被定义为public类型:是否定义为abstrac ...

  8. java类索引_《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合...

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

  9. java虚拟机标志_《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合...

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

最新文章

  1. 新闻媒体的“社会热点事件”催发微博客的诞生
  2. Linux系统日志级别
  3. 解决mantis不能上传附件问题
  4. SPOJ Substring Problem(Rabin Karp TLE)
  5. 9行代码AC_HDU-6374 Decimal(余数,因子)
  6. Linux APT VIM 的一些指令
  7. System.ComponentModel.Component : MarshalByRefObject, IComponent, IDisposable
  8. django-查询集特性
  9. mysql 计算近30天总金额_MySQL数分实战:咖啡店精细化运营
  10. [转载] python numpy 子数组_Python学习笔记3:Numpy入门
  11. 中兴F803/804 ONU实现端口间计算名(基于netbios协议)互通
  12. Linux集群在银行信息化中的应用(2)
  13. 【协同任务】基于matlab多无人机协同任务【含Matlab源码 1273期】
  14. Java中的list集合排序方法
  15. css+div透明参数设置
  16. 名帖72 颜真卿 楷书《竹山堂连句》
  17. java图形化界面编程之Swing
  18. 利用ps导出svg(主要用于上传自定义图标到iconfont)
  19. Unity开发游戏--2D坦克大战(一)
  20. BIM与三维GIS结合应用

热门文章

  1. 【Go语言】【15】GO语言的面向对象
  2. printf 规定数据输出方式
  3. 文件上传input简便美化方案
  4. 关于T4,正在发生的...
  5. Redis 架构之 cluster
  6. Influxdb中Select查询请求结果涉及到的一些数据结构
  7. c语言年历表程序设计,c语言程序设计年历显示-20210413153548.docx-原创力文档
  8. SpringCloud 从菜鸟到大牛之二 服务注册与发现 Sping Cloud Eureka
  9. 第二章--电商项目DB规划
  10. golang生成随机定长的验证吗