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父类)

      源代码:

      

  • 相关阅读:
    什么是page fault?
    [转载] 使用 Docker 部署 openstf 平台
    dockerfile中设置python虚拟环境+gunicorn启动
    python虚拟环境
    appium 多设备
    jenkins初始化和安装插件
    安装docker-ce
    Seleium Grid配置中的MaxInstances和MaxSession详解
    【GIS】GeoServer-Cache
    【GIS】GeoServer-服务权限
  • 原文地址:https://www.cnblogs.com/lrh-xl/p/5346516.html
Copyright © 2011-2022 走看看