jvm(4):类文件结构
typora-root-url: ./
类文件结构
魔数Magic Number
每个Class文件的头4个字节是魔数。值为0xCAFEBABE
唯一作用:确定这个文件是一个能被虚拟机接受的Class文件
Class文件的版本
紧挨着魔数的4个字节是Class文件的版本号:第5、6个字节是次版本号,第7、8个字节是主版本号。
高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件。
常量池
在常量池的入口处是常量池容量计数值,占两个字节。
例如,值为0x0016,即22,表示常量池中有21项常量。0表示不引用任何一个常量池项目
常量池中主要存放两大类常量:字面量和符号引用。
常量池中每一项常量都是一个表。表开始的第一位是一个u1类型的标志位,代表当前这个常量属于哪种常量类型。[比如是类或接口,标志位是0x07,类型是CONSTANT_Class_info
,即class]
14种常量类型各自均有自己的结构。[类结构是u1-tag,u2-name_index,值为0x0002,即class #2]
访问标志
两个字节,用于识别一些类或者接口层次的访问信息。
例如,值为0x0200的
ACC_INTERFACE
标识这是一个接口
类索引和父类索引
都是一个u2类型的数据。
类索引,用于确定这个类的全限定名。指向一个类描述符常量。
例如,类索引值为0x0001,即const #1
父类索引,用于确定这个类的父类的全限定名。除了java.lang.Object
外,所有Java类的父类索引都不为0。
接口索引集合
一组u2类型的数据的集合。
接口索引集合,用于描述这个类实现了哪些接口。按照implements语句后的接口顺序从左到右排序在接口索引集合中。
若值为0,则表示没有实现任何接口。否则后面跟着一个索引表。
字段表集合
用于描述接口或者类中声明的变量。包括类级变量以及实例级变量。不包括方法内部的局部变量。
某些信息[比如作用域、可变性、并发可见性等]可以使用标志位。
某些信息[比如字段名、字段类型]可以引用常量池中的常量来描述。
类型 | 名称 | 数量 | 含义 |
---|---|---|---|
u2 | access_flags | 1 | 标志位 |
u2 | name_index | 1 | 字段的简单名称 |
u2 | description_index | 1 | 字段和方法的描述符 |
u2 | attributes_count | 1 | |
attribute_info | attributes | attributes_count | 属性表 |
描述符:用一个大写字符表示基本数据类型和void,用L对象的全限定名表示对象类型,用[表示数组类型。
方法的描述符:按照先参数列表,后返回值的顺序描述。[()V 表示 void inc()]
例如,access_flags=
ACC_PRIVATE
,name_index=m,description_index=I,则表示源代码为private int m;
属性表集合用于存储一些额外的信息。[比如初始化的值]
字段表不会列出从超类或者父接口中继承而来的字段,但内部类有可能会自动添加指向外部类实例的字段。
字段无法重载的根本原因是:字段的描述符+字段名不可以重复。
方法表集合
和字段表集合差不多。属性表中有一个code
属性,存放的是方法里的java代码经过编译器编译的字节码指令。
方法表不会出现来自父类却没有被override的方法,但有可能出现类构造器<clinit>
方法和实例构造器<init>
方法。
方法可以重载:与原方法有同样的简单名称,但是有不同的特征签名[参数列表,不包含返回值]。
属性表集合
Code属性
方法里的java代码经过编译器编译的字节码指令。
Exceptions属性
列举方法中可能抛出的受查异常checked exceptions。
LineBumberTable属性
描述java源码行号与字节码行号之间的对应关系。
LocalVariableTable属性
描述栈帧中局部变量表中的变量与java源码中定义的变量之间的关系。
SourceFile属性
用于记录生成这个Class文件的源码文件名称。
ConstantValue属性
通知虚拟机自动为静态变量赋值。
InnerClasses属性
用于记录内部类与宿主类之间的关联。
Deprecated及Synthetic属性
Deprecated用于表示某个类、字段或者方法已经被程序作者定为不再推荐使用。
Synthetic代表此字段或者方法不是由Java源码直接产生的,而是由编译器自行添加的。
StackMapTable属性
变长属性,位于code属性的属性表中。在类加载的字节码验证阶段被新类型检查验证器使用。
Signature属性
记录泛型签名信息。
BootstrapMethods属性
变长属性,用于保存invokedynamic
指令引用的引导方法限定符。
字节码指令
JVM采用面向操作数栈的架构,大多数的指令都不包含操作数,只有一个操作码。
具体可以看jvm指令手册。
数据类型
- i:int
- l:long
- s:short
- b:byte
- c:char
- f:float
- d:double
- a:reference
加载和存储指令
局部变量->栈:iload
操作数栈->局部变量表:istore
常量->操作数栈:bipush、sipush、ldc、iconst
扩充局部变量表的访问索引:wide
运算指令
类型转换指令
对象创建与访问指令
操作数栈管理指令
控制转移指令
方法调用和返回指令
异常处理指令
同步指令
jvm(4):类文件结构的更多相关文章
- 深入理解JVM(六)类文件结构
6.1 关于类文件 1.class文件的一次编译,到处运行的跨平台性: 2.JVM不止有跨平台性,还有跨语言性,不管是JRuby还是Groovy写出来的程序,只要编译出符合JVM规范的class文件就 ...
- JVM(4) 类文件结构
一.实现“平台无关性” 字节码(ByteCode)存储格式和虚拟机是实现语言无关性的基础.Java虚拟机不和包括Java在内的任何语言绑定,它只与“Clas”文件这种特定的二进制文件格式所关联,Cla ...
- JVM小结--类文件结构
字节码是构成Java平台无关性的基石.实现语言无关性的基础是虚拟机和字节码存储格式. Java语言中的各种变量.关键字和运算符的语义最终是由多条字节码命令组成,因此字节码命令所能提供的语义描述能力肯定 ...
- JVM学习笔记(三):类文件结构
代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 实现语言无关性的基础是虚拟机和字节码存储格式.Java虚拟机不和包括Java在内的任何语言绑定,只与&quo ...
- jvm 类文件结构学习
本文以代码示例来学习 java 类文件的结构,其中对类文件结构的学习均来自周志明先生所著的 <深入理解 Java 虚拟机>一书,在此表示诚挚的感谢. 代码如下: package com.r ...
- 【搞定Jvm面试】 面试官:谈谈 JVM 类文件结构的认识
类文件结构 一 概述 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机.Java 语言通过字节码的方式,在一定程度上解决 ...
- 四、JVM — 类文件结构
类文件结构 一 概述 二 Class 文件结构总结 2.1 魔数 2.2 Class 文件版本 2.3 常量池 2.4 访问标志 2.5 当前类索引,父类索引与接口索引集合 2.6 字段表集合 2.7 ...
- JVM类文件结构
作为一名Java后台开发的程序员, 深入理解JVM, 重要性不言而喻, 这篇文章主要是记录JVM类文件结构相关知识. 2. 实例 这部分比较抽象, 所以以实例的形式来学习. 这部分作为资料, 以便后面 ...
- JVM学习第三天(JVM的执行子系统)之开篇Class类文件结构
虽然这几天 很忙,但是学习是不能落下的,也不能推迟,因为如果推迟了一次,那么就会有无数次;加油,come on! Java跨平台的基础: 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节 ...
随机推荐
- Math, Date,JSON对象
Math 对象 Math是 JavaScript 的原生对象,提供各种数学功能.该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用. 静态属性 Math对象的静态属性,提供以 ...
- 关于f(x)
有时 z = x + y 有时 0 = x + y 有时单独用f(x) 有时 z = f(x) 很容易分不清. 从集合角度,将f(x)看成映射 即从A集合到B集合的对应关系 这样f(x)可以单独使用, ...
- 【剑指Offer】04、重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 1级搭建类109-Oracle 12cR2 SI FS(Windows Server 2019)公开
Oracle 12cR2 单实例文件系统在Windows Server 2019上的安装 在线查看
- hdu 6182A Math Problem(快速幂)
You are given a positive integer n, please count how many positive integers k satisfy kk≤nkk≤n. Inp ...
- fastadmin选择下拉框
fastadmin中要做下拉框的效果如下: 数据库中数据: 在对应model中添加一个方法: 控制器中添加一行: 在目录lang/zh-cn中找到你控制器名称所对应的文件添加配置: 在add.html ...
- 栈和队列----设计一个有getMin功能的栈
设计一个有getMin功能的栈 设计一个具有getMin功能的栈,可以返回栈中的最小的元素,可以使用现有的栈的数据结构,要求pop/push/getMin操作的时间复杂度是O(1). package ...
- IOU 选框和真实框重叠部分占两个总框并集的比例
IOU 选框和真实框重叠部分占两个总框并集的比例 IOU 召回率:表示在预测为的正类中,有多少正类被预测为正类 https://blog.csdn.net/qq_36653505/article/de ...
- 01-SV入门及仿真环境搭建
1.SV入门 参考书籍<SystemVerilog验证 测试平台编写指南> [美]克里斯·斯皮尔 著 2.仿真环境搭建 仿真工具:modelsim se 2019.2,它不仅支持Veril ...
- Selenium3+python自动化013-操作浏览器的Cookie
为什么要用Cookie?在测试多个页面时候可绕过验证码输入,直接添加cookie,也可以在添加唯一标识时候使用. 一.操作浏览器的Cookie 1.1.验证码的处理方式 说明:WebDriver类库中 ...