《Java虚拟机原理图解》1.3、class文件里的訪问标志、类索引、父类索引、接口索引集合
讲完了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文件里的訪问标志、类索引、父类索引、接口索引集合的更多相关文章
- 《Java虚拟机原理图解》 1.2、class文件里的常量池
[最新更新:2014/11/11] 了解JVM虚拟机原理 是每个Java程序猿修炼的必经之路. 可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中 ...
- 《Java虚拟机原理图解》1.4 class文件里的字段表集合--field字段在class文件里是如何组织的
0.前言 了解JVM虚拟机原理是每个Java程序猿修炼的必经之路.可是因为JVM虚拟机中有非常多的东西讲述的比較宽泛.在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描写 ...
- 《Java虚拟机原理图解》 1.2.2、Class文件里的常量池具体解释(上)
[last updated:2014/11/27] NO1.常量池在class文件的什么位置? 我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了clas ...
- 《Java虚拟机原理图解》1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的
0. 前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描 ...
- 《Java虚拟机原理图解》1.4 class文件中的字段表集合--field字段在class文件中是怎样组织的
0.前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述 ...
- 《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合
讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标 ...
- 《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)
我的上一篇文章<Java虚拟机原理图解> 1.class文件基本组织结构中已经提到了class的文件结构,在class文件中的魔数.副版本号.主版本之后,紧接着就是常量池的数据区域了,如下 ...
- 《Java虚拟机原理图解》 1.2、class文件中的常量池
了解JVM虚拟机原理 是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给 ...
- 《Java虚拟机原理图解》 1.2.3、Class文件里的常量池具体解释(下)
NO9.类中引用到的field字段在常量池中是如何描写叙述的?(CONSTANT_Fieldref_info, CONSTANT_Name_Type_info) 一般而言.我们在定义类的过程中会定义一 ...
随机推荐
- 用merge into进行性能优化
有时候开发组有这么一个需求,一个表和它的备份表,把备份表中的某些字段替换到原表中,当数据量非常大的时候就很很慢,这个时候如果我们用merge into往往会提高几倍的性能,下面我们来做个实验: SQL ...
- HDU2084:数塔(DP)
Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...
- C# Setup package Uninstaller
安裝的部分就不介紹了,網上一搜一大堆,這裡只介紹下卸載的部分. 1.在C:\Windows\System32 目录下找到 msiexec.exe 拷贝到相应的地方,可修改名称为 Uninstall.e ...
- Java怎样高速构造JSON字符串
目标:依据key/value高速构造一个JSON字符串作为參数提交到web REST API服务上. 分别測试里阿里巴巴的FastJson和Google Gson,终于我採用了Google Gson来 ...
- ShareSDK for Android 只有新浪微博分享
本文代码例子:http://pan.baidu.com/share/link?shareid=3710053477&uk=3189484501 ShareSDK 官方的例子非常好,但代码太多看 ...
- 你喜欢SOAP吗?反正我不喜欢!
叫什么Simple Object Access Protocol,实际上一点都不Simple! 说什么轻量级协议,从它基于XML的编码就知道它有多臃肿! 说什么跨平台特性,其实各个语言需要自己实现一整 ...
- 【Web】java date 到 Oracle date 精确到时分秒
有两种方法: java.util.Date startTime=new Date("2014/01/01 23:00:00"); 1.new Timestamp(startTime ...
- IP数据包结构
Linux 网络编程——IP 数据报格式详解 http://www.linuxidc.com/Linux/2015-04/116149.htm
- git阶段学习总结
学习git大约有两个星期了,脑子里总算有点干货了,可以拿出来总结一下: git,用于版本控制的,刚开始觉得它是linux下默认的命令,其实也是个工具需要apt-get install git 安装一下 ...
- 笔记之Cyclone IV 第一卷第二章Cyclone IV器件的逻辑单元和逻辑阵
逻辑单元 (LE) 在 Cyclone IV 器件结构中是最小的逻辑单位.LE 紧密且有效的提供了高级功能的逻辑使用.每个 LE 有以下特性 ■ 一个四口输入的查找表 (LUT),以实现四种变量的任何 ...