Class文件解读(三)

接上篇:http://www.javashuo.com/article/p-xgfqiwgf-kz.htmljava

访问标志(access_flags)this

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

表1 访问标志.net

标志名称 标志值 含义
ACC_PUBLIC Ox0001 是否为public类型
ACC_FINAL Ox0010 是否被声明为final,只有类可设置
ACC_SUPER Ox0020 是否容许使用invokespecial字节码指令的新语意,invokespecial指的语意在JDK 1.0.2发生过改变,为了区分这条指令使用哪一种语意,JDK 1.0.2以后编译出来的类的这个标志都必须为真
ACC_INSTERFACE Ox0200 标识这是一个接口
ACC_ABSTRACT Ox0400 是否为abstract类型,对于接口或者抽象类来讲,此标志位真,其余类型为假
ACC_SYNTHETIC Ox1000 标志这个类并不是由用户代码产生的
ACC_ANNOTATION Ox2000 标识这个一个注解
ACC_ENUM Ox4000 标识这是一个枚举类

      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)blog

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

     类索引(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,值分别为Ox000二、Ox000四、Ox0000(无接口索引表),经过上面对各索引项的解释及结合本系列第二篇针对常量池进行具体讲解的博客篇(https://my.oschina.net/u/3345762/blog/880152)能够了解到该Class文件中类索引指向的常量值为org/lucas/clazz/TestClass,父类索引指向的常量值为java/lang/Object,接口索引集合为空。ci

下篇:http://www.javashuo.com/article/p-pjhsbtkd-kz.html字符串

相关文章
相关标签/搜索