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类型,对接口或抽象类来说,此标志为真,其他类为假  
---------------------------------------------- 

posted @ 2013-04-08 13:15  君子笑而不语  阅读(224)  评论(0编辑  收藏  举报