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

简介: JVM虚拟机-Class文件之类索引、父类索引和接口索引集合

 image.gif编辑

 

一、概述

前面介绍了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。

索引位置参见下图:

image.gif编辑

三、案例分析

新建接口:

public interface HelloWord {
}

image.gif

image.gif编辑

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

image.gif编辑

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

image.gif编辑

image.gif编辑

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

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

image.gif编辑

来个复杂一点的:

public interface HelloWord extends StringBuilderFormattable, Serializable {
}

image.gif

image.gif编辑

通过javap来进行分析:

image.gif编辑

参考资料:

    1. JVM-class文件完全解析-类索引,父类索引和索引集合 - 小凉 - 博客园
    2. Class文件详解_IT_GJW的博客-CSDN博客_class文件是什么
    3. Class类文件的结构(一)常量池、访问标志和索引_WindSearcher的博客-CSDN博客
    相关文章
    |
    3月前
    |
    SQL 存储 数据挖掘
    【虚拟机数据恢复】VMware虚拟机文件被误删除的数据恢复案例
    虚拟机数据恢复环境: 某品牌R710服务器+MD3200存储,上层是ESXI虚拟机和虚拟机文件,虚拟机中存放有SQL Server数据库。 虚拟机故障: 机房非正常断电导致虚拟机无法启动。服务器管理员检查后发现虚拟机配置文件丢失,所幸xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还在。服务器管理员在尝试恢复虚拟机的过程中,将原虚拟机内的xxx-flat.vmdk删除后新建了一个虚拟机,并分配了精简模式的虚拟机磁盘和快照数据盘,但原虚拟机内的数据并没有恢复。
    【虚拟机数据恢复】VMware虚拟机文件被误删除的数据恢复案例
    |
    1月前
    |
    存储 Java 数据安全/隐私保护
    【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
    【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
    36 0
    |
    26天前
    |
    缓存 Java C#
    【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
    【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
    73 0
    |
    7天前
    |
    缓存 监控 Java
    深入理解Java虚拟机(JVM)性能调优
    【4月更文挑战第18天】本文探讨了Java虚拟机(JVM)的性能调优,包括使用`jstat`、`jmap`等工具监控CPU、内存和GC活动,选择适合的垃圾回收器(如Serial、Parallel、CMS、G1),调整堆大小和新生代/老年代比例,以及代码优化和JIT编译策略。通过这些方法,开发者能有效提升应用性能并应对复杂性挑战。性能调优是持续过程,需伴随应用演进和环境变化进行监控与优化。
    |
    9天前
    |
    存储 XML 监控
    JVM工作原理与实战(三):字节码文件的组成
    JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了字节码文件的基础信息、常量池、方法、字段、属性等内容。
    26 6
    |
    23天前
    【嵌入式】虚拟机未能将管道连接到虚拟机: 系统找不到指定的文件
    【嵌入式】虚拟机未能将管道连接到虚拟机: 系统找不到指定的文件
    |
    1月前
    |
    存储 Java 编译器
    JVM虚拟机内存区域详情
    JVM虚拟机内存区域详情
    15 0
    |
    1月前
    |
    存储 安全 前端开发
    什么是Java虚拟机(JVM),它的作用是什么?
    什么是Java虚拟机(JVM),它的作用是什么?
    |
    1月前
    |
    存储 Java 开发者
    深入理解Java虚拟机(JVM)内存管理
    【2月更文挑战第11天】 在本篇文章中,我们将深入探讨Java虚拟机(JVM)的内存管理机制,一项对于优化Java应用性能至关重要的技术领域。不同于常规的技术文章摘要,我们不仅概述了JVM内存管理的基本概念,还将引导读者通过实际案例理解其在现实世界应用中的重要性。从堆(Heap)和栈(Stack)的区别开始,到垃圾收集(Garbage Collection)机制的工作原理,本文旨在为Java开发者提供一个清晰、系统的JVM内存管理知识框架,帮助他们在开发过程中做出更加明智的决策。
    |
    2月前
    |
    存储 Linux KVM