zoukankan      html  css  js  c++  java
  • Class文件结构之类/父类/接口索引集合

    此文记录Class文件中 类索引(this_class),父类索引(super_class),接口索引集合(interfaces)表示方法。
        类索引,类索引 都是一个u2类型的数据,接口索引集合 是一组u2类型的数据集合(因为类是单继承,多实现)。
     例子:


    package cn.tao;
    public class TestClass {
       private int m;
       public int inc(int m){
         return m+1;
       }
    }
    TestClass.class 内容如下(16进制查看)
    图1

    图1中,从偏移地址0x000000CE开始
    3个u2类型的值0x0001,0x0003,0x0000,
    即类索引为 1,父索引为 3,接口计数值为0
    查询javap计算出来的常量值,找出对应的索引
    TestClass.class 其常量池常量如下:
    图2.其中引用到的索引 1和3 代表本类cn.tao.TestClass,父类java.lang.Object,而0表示实现接口数=0
     

    说明:访问标志中
    ACC_PUBLIC 0x0001 是否为public类型
    ACC_SUPER  0x0020 是否允许用invokespecial字节码指令,JDK1.2后编译的类的此标志为真(因为JDK1.2后的类都有父类java.lang.Object)
    而接口索引0x0000指向0,代表"没有引用常量池任何一个项目",这也是常量池从"1"开始计数的原因
    顺便提一下 CONSTANT_Class_info型常量的结构
    ---------------------------------------------------
              类型             名称               数量     
    ----------------------------------------------------------
                 u1               tag                1      
                 u2               name_index         1  
    ----------------------------------------------

    附加表述内容,偏移地址0x000000CC的u2类型数据表示访问标志,详见书《深入*》p147,这里列举几个常见的
    ---------------------------------------------------
              标志名称        标志值             含义     
    ----------------------------------------------------------
              ACC_PUBLIC      0x0001            是否为public类型       
              ACC_FINAL       0x0010      是否被声明为final,只有类可以设置
              ACC_SUPER       0x0020      是否允许用invokespecial字节码指令,JDK1.2后编译的类的此标志为真
             ACC_INTERFACE   0x0200      标识这是一个接口
             ACC_ABSTRACT    0x0400      是否为abstract类型,对接口或抽象类来说,此标志为真,其他类为假  
    ---------------------------------------------- 

  • 相关阅读:
    C系统,操作符和词法元素
    值类型和引用类型
    WPF
    C#版本进化
    快速排序
    C语言字符串
    查找
    简单快速排序
    PHP运行出现Notice : Use of undefined constant 的解决办法
    vs2010 修改注释模板
  • 原文地址:https://www.cnblogs.com/xiaoliu66007/p/3007233.html
Copyright © 2011-2022 走看看