【JVM虚拟机】(6)---深入理解Class中访问标志、类索引、父类索引、接口索引
JVM(6)访问标志,类索引
上一篇博客讲【JVM虚拟机】(5)---深入理解JVM-Class中常量池
我们知道一个class文件正常可以分为7个部分:
- 魔数与class文件版本
- 常量池
访问标志
类索引、父类索引、接口索引
- 字段表集合
- 方法表集合
- 属性表集合
那么这篇博客主要讲有关 访问标志 和 类索引、父类索引、接口索引 相关的理解和代码示例。
先通俗的说下这两个的作用:
访问标志
: 告知该类是一个什么类型的类,是普通类?还是接口?还是枚举?或者其它类,是用什么修饰符修饰该类的。
类索引、父类索引、接口索引
: 告知该类全限名的常量池地址,有继承的话父类全限名的常量池地址,实现接口的话接口全限名的常量池地址(接口可以多个)。
一、概述
先对上篇博客做个补充:上篇博客虽然说了常量池但对class整体文件结构并没有说清楚,其实一个class文件即
.class
文件本质上就是一张表
,由下表所示的数据项构成。
上图也就是一开始所讲的7个部分组成。
二、访问标志
有关访问标志
找了很多资料,也看了《深入了解java虚拟机》书中第六章给的有关访问标志的信息,网上几乎讲访问标志都是下面这张图,然后写个pulic class 类 一测试,果然是0021 代表 ACC_PUBLIC+ACC_SUPER
这样一看是没毛病。但是都没有再写一个接口来验证的,如果自己写个接口就会发现下面我圈红的地方说,JDK1.2后该处必须为真 是不对的
。先看图。
1、访问标志转为16进制解释
思考
:就好比为什么ACC_PUBLIC是00 01?如何产生的呢。
访问标志
实际上就是一系列组合,因为有16位所以共有16个标志可以使用,但是目前就定义了8个,剩下的估计是给jdk9和10......预留的吧。这8个如图所示。
讲完理论,接下来我们进行代码测试,为了校验更佳准确我写个普通类和接口分别测试:
2、public class修饰类
public class XiaoXiao {
}
在同一目录生成成class文件
javac XiaoXiao.java
在看反编译class文件
javap -v XiaoXiao.class
我们发现这里flags为: ACC_PUBLIC, ACC_SUPER
,那这么推算那么十六进制应该是0021。
那我们再来查看XiaoXiao.class的十六进制数据
完美吻合。
3、接口校验
public interface DaDa {
}
同样先生成class文件在反编译class文件
看图我们可以发现flags值为:ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
,这个也很好理解接口本身就是抽象类。那么加起来就是0601
。但这里和上图有点不符的地方就是图中说ACC_SUPER只要是JDK1.2必须为真,而这里明显不为真,所以有关这点并不准确。
那我们再将class文件转位16进制验证。
这么一来验证也是通过的。
有关ACC_SUPER不准确的问题,应该是ACC_SUPER不会
是在JDK1.2以后必须为真,应该如下描述:
三、类索引、父类索引、接口索引
1、概念
在 .class 文件中由这三项数据来确定这个类
的继承关系。
1、类索引
:u2 数据类型,用于确定这个类
的全限定名。
2、父类索引
:u2 数据类型,用于确定这个类的父类
的全限定名。
3、接口索引
:u2 数据类型的集合,用于描述类实现了哪些接口
,这些被实现的接口将按照 implements 语句后的顺序从左至右排列在接口索引集合中。
接口索引集合分为两部分,第一部分表示接口计数器
(interfaces_count),是一个 u2 类型的数据,第二部分是接口索引表
表示接口信息,紧跟在接口计数器之后。
若一个类实现的接口为 0,则接口计数器的值为 0,接口索引表不占用任何字节。
同样这里测试写两个测试类来测试。
1、普通类测试
public class XiaoXiao {
}
同样生成class文件,然后查看16进制数据
我们看到该类的类索引在常量池0002位置 ,父类索引在常量池0003位置,接口为0000代表该类没有实现任何接口。
然后我们在反编译XiaoXiao.class文件,方便我们查找常量池。
真的是一目了然,常量池0002就是当前类,0003父类为默认继承了老祖宗Object。
完美!
2、实现接口测试
为了更加深刻理解,这里再写一个类实现两个接口的类,在来查看。
//接口
public interface DaDa {
}
//接口
public interface LaLa {
}
//类实现上面两个接口
public class XiaoXiao implements DaDa ,LaLa{
}
说明
:这里不能通过 javac XiaoXiao.java
生成XiaoXiao.class文件了,因为会报错。我分析原因是因为你手动编译是无法找到DaDa ,LaLa编译信息。
所以我们可以把整个项目启动后,到target目录下去找该class文件就可以。
在打开16进制文件。
我们看到该类的类索引在常量池0002位置 ,父类索引在常量池0003位。接口为0002代表该类实现了两个接口,一个接口在常量池位置004,一个在常量池位置0005。
在看反编译后的class文件。
验证成功!
参考
1、深入了解java虚拟机第2版第六章
只要自己变优秀了,其他的事情才会跟着好起来(少将4)
【JVM虚拟机】(6)---深入理解Class中访问标志、类索引、父类索引、接口索引的更多相关文章
- [转]深刻理解Python中的元类(metaclass)以及元类实现单例模式
使用元类 深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例 ...
- cc31a_demo--CppPrimer_静态成员与继承-在派生类中访问基类中的static成员的方法
//*基类中的static成员,在整个继承层次中只有一个实例 //*在派生类中访问基类中的static成员的方法 //1.基类名::成员名 //2.子类名::成员名 //3.对象.成员名 //4.指针 ...
- 深刻理解Python中的元类(metaclass)以及元类实现单例模式
在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍 ...
- 深刻理解Python中的元类metaclass(转)
本文由 伯乐在线 - bigship 翻译 英文出处:stackoverflow 译文:http://blog.jobbole.com/21351/ 译注:这是一篇在Stack overflow上很热 ...
- 深刻理解Python中的元类(metaclass)
译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...
- [转] 深刻理解Python中的元类(metaclass)
非常详细的一篇深入讲解Python中metaclass的文章,感谢伯乐在线-bigship翻译及作者,转载收藏. 本文由 伯乐在线 - bigship 翻译.未经许可,禁止转载!英文出处:stacko ...
- 深刻理解Python中的元类(metaclass)【转】
译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...
- 深入理解Python中的元类(metaclass)
原文 译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍 ...
- 深度理解python中的元类
本文转自:(英文版)https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python (翻译版) http:// ...
随机推荐
- Vue作者尤雨溪:以匠人的态度不断打磨完善Vue (图灵访谈)
访谈对象: 尤雨溪,Vue.js 创作者,Vue Technology创始人,致力于Vue的研究开发. 访谈内容: 你为何选择从事前端方面的工作? 其实,我本科读的是艺术史,研究生阶段学习Design ...
- C入门语言基础一[可移植性、涉及的三种文件、编程7个步骤、编译器、链接器]
Review Questions What dose portability mean in the context of programming? 文中讲到的可移植性是什么意思? C本身是不涉及 ...
- cocos2dx中的坐标系统
一. (1)OpenGL坐标系 Cocos2D-x以OpenGL和OpenGL ES为基础,所以自然支持OpenGL坐标系.该坐标系原点在屏幕左下角,x轴向右,y轴向上. (2)屏幕坐标系 屏幕坐标系 ...
- 第二次作业 单例模式的SessionFactory
一.基础Hibernate环境搭建(参见http://www.cnblogs.com/sangewuxie/p/9004968.html) 二.实体类User及User.hbm.xml配置 1.Use ...
- POJ 2411 解题报告
传送门:http://poj.org/problem?id=2411 题目简述 有一个\(W\)行\(H\)列的广场,需要用\(1*2\)小砖铺满,小砖之间互相不能重叠,问 有多少种不同的铺法? 输入 ...
- java(二、基础语法和基本数据类型)
Java 基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一 ...
- textarea 里设置 style="resize:none"
禁止textarea拉伸的方法是:: 设置这个 style="resize:none" 属性 例子: < ...
- PAT1055:The World's Richest
1055. The World's Richest (25) 时间限制 400 ms 内存限制 128000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- javascript中的隐式类型转化
javascript中的隐式类型转化 #隐式转换 ## "+" 字符串和数字 如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作. 如果其中一个操作数是对 ...
- Struts标签库详解【3】
struts2标签库详解 要在jsp中使用Struts2的标志,先要指明标志的引入.通过jsp的代码的顶部加入以下的代码: <%@taglib prefix="s" uri= ...