zoukankan      html  css  js  c++  java
  • JVM-class文件完全解析-类索引,父类索引和索引集合

       类索引,父类索引和接口索引集合

      前面介绍了class文件,从头开始的魔数,次版本号,主版本号,常量池入口,常量池,访问标志.那么再接下来的就是用来确定这个类的继承关系的类索引,父类索引和接口索引集合这三项了.

      下面就来认识一下这三项内容. 

      类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合(interfaces)是一组u2类型的数据的集合,class文件中由这三项数据来确定这个类的继承关系.

      类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名.接口索引集合用来描述这个类实现了哪些接口,这些被实现的接口按implements语句后的接口顺序从左到右排列在接口索引集合中.

      类索引,父类索引和接口都按顺序排列在访问标志之后,类索引和父类索引用两个u2类型的索引值表示,它们各自指向一个类型为CONSTANT_Class_info的类描述常量,通过CONCTANT_Class_info类型的常量中的索引值可以找到定义在CONSTANT_Class_info类型的常量中的全限定名字符串.

      对接口索引集合,入口的第一项u2类型的数据为接口计数器(interface_count)表示索引表的容量.如果该类没有实现任何接口,则该计数器值为0,后面接口的索引表不再占用任何字节.

     下面我们继续前面分析的class文件,继续往下走,分析上面这三项内容:

    class文件及分析:

      那么现在我们拿这几个值和我们介绍常量池的时候用javap工具分析的常量池的时候查看的常量池的内容,验证一下是否正确.

      

      因为0x00 03 和0x00 04十六进制对应与十进制的3和4,所以类索引和父类索引就对应第三和第四个常量池.从上图看第三和第四个常量池分别对应TestClass和Object两个类,再看一下源代码,就知道结果是正确的.(因为我的类名就是TestClass,没有显示继承任何类,就是默认继承了Object父类)

      源代码:

      

  • 相关阅读:
    Redis的事务、锁及管理命令
    Redis消息队列
    Redis管理实战
    Redis入门部署及持久化介绍
    MySQL的存储引擎
    MHA高可用及读写分离
    jquery css hover
    SqlParameter 中 top 的使用
    Jquery 操作DropDownList 根据条件选中
    js 数值格式化函数
  • 原文地址:https://www.cnblogs.com/lrh-xl/p/5346516.html
Copyright © 2011-2022 走看看