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