讲完了class文件里的常量池,我们就相当于克服了class文件里最麻烦的模块了。如今,我们来看一下class文件里紧接着常量池后面的几个东西:訪问标志、类索引、父类索引、接口索引集合。

1. 訪问标志、类索引、父类索引、接口索引集合 在class文件里的位置

好,让我们来一一击破它们,看看它们究竟是什么东西。

2. 訪问标志(access_flags)可以表示什么?

訪问标志(access_flags)紧接着常量池后。占有两个字节。总共16位,例如以下图所看到的:

JVM在编译某个类或者接口的源码时,JVM会解析出这个类或者接口的訪问标志信息,然后。将这些标志设置到
訪问标志(access_flags)这16个位上。

JVM会考虑例如以下设置例如以下訪问表示信息:

a. 我们知道,每一个定义的类或者接口都会生成class文件(这里也包含内部类。在某个类中定义的静态内部类也会单独生成一个class文件)。

对于定义的类。JVM在将其编译成class文件时,会将class文件的訪问标志的第11位设置为
1 。第11位叫做ACC_SUPER标志位

对于定义的接口,JVM在将其编译成class文件时。会将class文件的訪问标志的第8
设置为 1
。第8位叫做ACC_INTERFACE标志位

 b.
class文件表示的类或者接口的訪问权限有public
类型的和包package类型的。

假设类或者接口被声明为public
类型的。那么,JVM将其编译成class文件时,会将class文件的訪问标志的第16位设置为
1

16位叫做ACC_PUBLIC标志符

 c. 类是否为抽象类型的。即我们定义的类有没有被abstract
keyword修饰。即我们定义的类是否为抽象类。

假设我们形如:

public  abstract  class MyClass{......} 

定义某个类时,JVM将它编译成class文件的时候。会将class文件的訪问标志的第7位设置为
1

7位叫做ACC_ABSTRACT标志位

另外值得注意的是,对于定义的接口,JVM在编译接口的时候也会对class文件的訪问标志上的ACC_ABSTRACT标志位设置为
1

d. 该类是否被声明了final类型,即表示该类不能被继承。

此时JVM会在编译class文件的过程中。会将class文件的訪问标志的第12位设置为
1

12位叫做ACC_FINAL标志位

e.假设我们这个class文件不是JVM通过java源码文件编译而成的,而是用户自己通过class文件的组织规则生成的。那么,通常会对class文件的訪问标志4位设置为
1
。通过JVM编译源码产生的class文件此标志位为
0
。第4位叫做ACC_SYNTHETIC标志位

f. 枚举类,对于定义的枚举类如:public enum EnumTest{....},JVM也会对此枚举类编译成class文件,这时,对于这种class文件,JVM会对訪问标志2位设置为
1
。以表示它是枚举类。第2位叫做ACC_ENUM标志位

g. 注解类。对于定义的注解类如:public @interface{.....},JVM会对此注解类编译成class文件,对于这种class文件,JVM会将訪问标志3位设置为1,以表示这是个注解类,第3位叫做ACC_ANNOTATION标志位

JVM确定了上述标志位的值后。就能够确定訪问标志(access_flags)的值了。实际上JVM上述标志会依据上述确定的标志位的值,对这些标志位的值取或,便得到了訪问标志(access_flags)。例如以下图所看到的:

举例:定义一个最简单的类Simple.java,使用编译器编译成class文件,然后观察class文件里的訪问标志的值,以及使用javap -v Simple 查看訪问标志。

package com.louis.jvm;

public class Simple {

}

使用UltraEdit查看编译成的class文件。例如以下图所看到的:

上述的图中黄色部分表示的是常量池部分。详细为什么是常量池部分不是本文的重点。有兴趣的读者能够參考我的《Java虚拟机原理图解》系列关于常量池的博客。你就能够非常轻松地识别常量它们了。

常量池后面紧跟着就是訪问标志。它的十六进制值为0x0021,二进制的值为:
0000000 000100001,由二进制的1的位数能够得出第12、16位为1,分别相应ACC_SUPER标志位ACC_PUBLIC标志位

也能够通过一下运算:

  0x0021 = 0x0001 | 0x0020,  即:   訪问标志表示的标志是ACC_PUBLIC + ACC_SUPER

为了验证我们的运算。使用javap -v Simple
查看反编译信息例如以下:(小技巧:使用javap -v Simple指令的结果展示在命令提示符下显示不友好,一般我是使用javap
-v Simple > temp.txt
,将结果重定向到文件里。然后查看文件)

3. 类索引(this_class)是什么?

我们知道普通情况下一个Java类源文件经过JVM编译会生成一个class文件。也有可能一个Java类源文件里定义了其它类或者内部类,这样编译出来的class文件就不止一个,但每个class文件表示某一个类,至于这个class表示哪一个类,便能够通过 类索引 这个数据项来确定。JVM通过类的全然限定名确定是某一个类。

类索引的作用,就是为了指出class文件所描写叙述的这个类叫什么名字。

类索引紧接着訪问标志的后面,占有两个字节,在这两个字节中存储的值是一个指向常量池的一个索引。该索引指向的是CONSTANT_Class_info常量池项,

以上面定义的Simple.class 为例,例如以下图所看到的。查看他的类索引在什么位置和取什么值。

由上可知,它的类索引值为0x0001,那么,它指向了常量池中的第一个常量池项,那我们再看一下常量池中的信息。使用javap -v Simple,常量池中有下面信息:

能够看到常量池中的第一项是CONSTANT_Class_info项,它表示一个"com/louis/jvm/Simple"的类名。即类索引是告诉我们这个class文件所表示的是哪一个类。

3. 父类索引(super_class)是什么?

Java支持单继承模式,除了java.lang.Object 类除外,每个类都会有且仅仅有一个父类。

class文件里紧接着类索引(this_class)之后的两个字节区域表示父类索引,跟类索引一样。父类索引这两个字节中的值指向了常量池中的某个常量池项CONSTANT_Class_info。表示该class表示的类是继承自哪一个类。

4. 接口索引集合(interfaces)是什么?

一个类能够不实现不论什么接口,也能够实现非常多个接口。为了表示当前类实现的接口信息,class文件使用了例如以下结构体描写叙述某个类的接口实现信息:

因为类实现的接口数目不确定。所以接口索引集合的描写叙述的前部分叫做接口计数器(interfaces_count)接口计数器占用两个字节,当中的值表示着这个类实现了多少个接口。紧跟着接口计数器的部分就是接口索引部分了,每个接口索引占有两个字节。接口计数器的值代表着后面跟着的接口索引的个数。接口索引和类索引和父类索引一样,其内的值存储的是指向了常量池中的常量池项的索引。表示着这个接口的全然限定名。

举例:

定义一个Worker接口,然后类Programmer实现这个Worker接口,然后我们观察Programmer的接口索引集合是如何表示的。

/**
* Worker 接口类
* @author luan louis
*/
public interface Worker{ public void work(); }
package com.louis.jvm;

public class Programmer implements Worker {

	@Override
public void work() {
System.out.println("I'm Programmer,Just coding....");
}
}

作者的话

本文是《Java虚拟机原理图解》系列的当中一篇,假设您有兴趣。请关注该系列的其它文章~

认为本文不错,顺手点个赞哦~~您的鼓舞,是我继续分享知识的强大动力。

-----------------------------------------------------------------------------------------------------------------------------------------

本文源自  http://blog.csdn.net/luanlouis/,如需转载,请注明出处。谢谢。

《Java虚拟机原理图解》1.3、class文件里的訪问标志、类索引、父类索引、接口索引集合的更多相关文章

  1. 《Java虚拟机原理图解》 1.2、class文件里的常量池

    [最新更新:2014/11/11]  了解JVM虚拟机原理 是每个Java程序猿修炼的必经之路. 可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中 ...

  2. 《Java虚拟机原理图解》1.4 class文件里的字段表集合--field字段在class文件里是如何组织的

    0.前言 了解JVM虚拟机原理是每个Java程序猿修炼的必经之路.可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描写 ...

  3. 《Java虚拟机原理图解》 1.2.2、Class文件里的常量池具体解释(上)

    [last updated:2014/11/27] NO1.常量池在class文件的什么位置? 我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了clas ...

  4. 《Java虚拟机原理图解》1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的

    0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描 ...

  5. 《Java虚拟机原理图解》1.4 class文件中的字段表集合--field字段在class文件中是怎样组织的

    0.前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述 ...

  6. 《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合

    讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标 ...

  7. 《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)

    我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了class的文件结构,在class文件中的魔数.副版本号.主版本之后,紧接着就是常量池的数据区域了,如下 ...

  8. 《Java虚拟机原理图解》 1.2、class文件中的常量池

    了解JVM虚拟机原理 是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给 ...

  9. 《Java虚拟机原理图解》 1.2.3、Class文件里的常量池具体解释(下)

    NO9.类中引用到的field字段在常量池中是如何描写叙述的?(CONSTANT_Fieldref_info, CONSTANT_Name_Type_info) 一般而言.我们在定义类的过程中会定义一 ...

随机推荐

  1. ThinkPHP 3.1.2 控制器的模块和操作

    本节课大纲: 一.空模块和空操作 1.空操作 function _empty($name){ $this->show("$name 不存在 <a href='__APP__/In ...

  2. Hdu 2364 Escape

    Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=2364 这道题的特殊之处在于能转弯时不能直走,必须转弯,所以在行走时,要判断能否转弯,不能转弯 ...

  3. ALEX WANG(王培沂)品牌_时尚频道_凤凰网

    ALEX WANG(王培沂)品牌_时尚频道_凤凰网 ALEX WANG地址: 北京朝阳区百子湾路32号苹果社区10号楼B座2205 订制热线:010-58263402

  4. 搜狐畅游:每月给员工直系长辈2000元爱孝薪_企业新闻_265G产业频道

    搜狐畅游:每月给员工直系长辈2000元爱孝薪_企业新闻_265G产业频道 搜狐畅游:每月给员工直系长辈2000元爱孝薪

  5. Lucene 实例教程(二)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...

  6. (记录前面算过的后面仍然会用的数减小复杂度)A - AC Me

    Description Ignatius is doing his homework now. The teacher gives him some articles and asks him to ...

  7. ZOJ 2856 Happy Life 暴力求解

    因为是Special Judge 的题目,只要输出正确答案即可,不唯一 暴力力求解, 只要每次改变 happiness 值为负的人的符号即可. 如果计算出当前人的 happiness 值为负,那么将其 ...

  8. HttpResponseRedirect VS HttpResponse

    当我们处理了post提交的数据之后,我们使用HttpResponseRedirect跳转到另一个页面,而不是用HttpResponse. 例如当一个投票环节时使用HttpResponse可以使用浏览器 ...

  9. Week6(10月17日):周末别忘记运动

    Part I:提问  =========================== 1.多对多.一对多关系的数据实体模型,如何创建? 已知汽车4S店需开发一个客户关系管理系统(CRM),请为其中的客户和汽车 ...

  10. 如何去掉IE控件的垂直滚动条(使用QAxWidget加载IE控件)

    如果使用MFC的CHtmlView或Qt的QAxWidget加载IE控件,载入html文件后都会自动带一个垂直滚动条,我们不想要这个滚动条,改怎么办呢?搜索了一下“隐藏IE控件滚动条”,发现在 htt ...