Class文件解读(三)

Java Class文件结构解析

接上篇:https://my.oschina.net/u/3345762/blog/880152

访问标志(access_flags)

        在常量池结束之后,紧接着的两个字节代表访问标志,这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口:是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final等。具体的标志位及标志的含义见表1。

表1 访问标志

标志名称标志值含义
ACC_PUBLICOx0001是否为public类型
ACC_FINALOx0010是否被声明为final,只有类可设置
ACC_SUPEROx0020是否允许使用invokespecial字节码指令的新语意,invokespecial指的语意在JDK 1.0.2发生过改变,为了区分这条指令使用哪种语意,JDK 1.0.2之后编译出来的类的这个标志都必须为真
ACC_INSTERFACEOx0200标识这是一个接口
ACC_ABSTRACTOx0400是否为abstract类型,对于接口或者抽象类来说,此标志位真,其他类型为假
ACC_SYNTHETICOx1000标志这个类并非由用户代码产生的
ACC_ANNOTATIONOx2000标识这个一个注解
ACC_ENUMOx4000标识这是一个枚举类

      access_flags中一共有16个标志位可以使用,当前只定义了其中8个,没有使用到的标志位要求一律为0。以本系列文章中的代码为例,TestClass是一个普通java类,不是接口、枚举或者注解,被public关键字修饰但没有被声明为final和abstract,并且它使用了JDK 1.2之后的编译器进行编译,因此它的ACC_PUBLIC、ACC_SUPER为真,ACC_FINAL、ACC_INSTERFACE、ACC_ABSTRACT、ACC_SYNTHETIC、ACC_ANNOTATION、ACC_ENUM这6个标志应当为假,因此它的access_flags的值应为Ox0001|Ox0020=Ox0021,在本例Class文件中可查看到该类的访问标志值的确为Ox0021(偏移地址:Ox00000100,偏移量:0)

类索引、父类索引与接口索引集合

     类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合(interfaces)是一组u2类型的数据集合,Class文件中由这三项数据来确定类的继承关系,类索引用于确定这个类的全限定名,父类索引用于确定这个类父类的全限定名,由于java语言不允许多重继承,所以父类索引只有一个,除了java.lang.Object之外,所有的Java类都有父类,也就是说除了java.lang.Object之外所有的父类索引都不为0。接口索引集合用来表示这个类实现的接口情况,这些被实现的接口将按implements语句(如果这个类本身是一个接口,则应当是extends语句)后的接口顺序从左到右排列在接口索引集合中。

类索引、父类索引和接口索引集合都按顺序排列在访问标志位之后,类索引和父类索引用两个u2类型的索引值表示,他们各指向一个类型为CONSTANT_Class_info的类描述符常量,通过CONSTANT_Class_info类型的常量中的索引值可以找到定义在CONSTANT_Utf8_info类型的常量中的全限定名字符串。对于接口索引集合,入口的第一项——u2类型的数据为接口计数器(interfaces_count),表示索引表的容量,如果该类没有实现任何接口,则该计数器值为0,后面接口的索引表不再占用任何字节。

        从上图中可以看到该Class文件中,类索引、父类索引、接口索引集合偏移地址均为Ox00000100,值分别为Ox0002、Ox0004、Ox0000(无接口索引表),通过上面对各索引项的解释及结合本系列第二篇针对常量池进行具体讲解的博客篇(https://my.oschina.net/u/3345762/blog/880152)可以了解到该Class文件中类索引指向的常量值为org/lucas/clazz/TestClass,父类索引指向的常量值为java/lang/Object,接口索引集合为空。

下篇:https://my.oschina.net/u/3345762/blog/894106

转载于:https://my.oschina.net/u/3345762/blog/889512

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值