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):类文件结构的更多相关文章

  1. 深入理解JVM(六)类文件结构

    6.1 关于类文件 1.class文件的一次编译,到处运行的跨平台性: 2.JVM不止有跨平台性,还有跨语言性,不管是JRuby还是Groovy写出来的程序,只要编译出符合JVM规范的class文件就 ...

  2. JVM(4) 类文件结构

    一.实现“平台无关性” 字节码(ByteCode)存储格式和虚拟机是实现语言无关性的基础.Java虚拟机不和包括Java在内的任何语言绑定,它只与“Clas”文件这种特定的二进制文件格式所关联,Cla ...

  3. JVM小结--类文件结构

    字节码是构成Java平台无关性的基石.实现语言无关性的基础是虚拟机和字节码存储格式. Java语言中的各种变量.关键字和运算符的语义最终是由多条字节码命令组成,因此字节码命令所能提供的语义描述能力肯定 ...

  4. JVM学习笔记(三):类文件结构

    代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 实现语言无关性的基础是虚拟机和字节码存储格式.Java虚拟机不和包括Java在内的任何语言绑定,只与&quo ...

  5. jvm 类文件结构学习

    本文以代码示例来学习 java 类文件的结构,其中对类文件结构的学习均来自周志明先生所著的 <深入理解 Java 虚拟机>一书,在此表示诚挚的感谢. 代码如下: package com.r ...

  6. 【搞定Jvm面试】 面试官:谈谈 JVM 类文件结构的认识

    类文件结构 一 概述 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机.Java 语言通过字节码的方式,在一定程度上解决 ...

  7. 四、JVM — 类文件结构

    类文件结构 一 概述 二 Class 文件结构总结 2.1 魔数 2.2 Class 文件版本 2.3 常量池 2.4 访问标志 2.5 当前类索引,父类索引与接口索引集合 2.6 字段表集合 2.7 ...

  8. JVM类文件结构

    作为一名Java后台开发的程序员, 深入理解JVM, 重要性不言而喻, 这篇文章主要是记录JVM类文件结构相关知识. 2. 实例 这部分比较抽象, 所以以实例的形式来学习. 这部分作为资料, 以便后面 ...

  9. JVM学习第三天(JVM的执行子系统)之开篇Class类文件结构

    虽然这几天 很忙,但是学习是不能落下的,也不能推迟,因为如果推迟了一次,那么就会有无数次;加油,come on! Java跨平台的基础: 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节 ...

随机推荐

  1. 设置完代理IP,手机连接WiFi时连不上,一直在转

    fiddler抓包,设置代理后,会出现手机连不上网的情况,针对这个情况处理方式为: 首先如果已经连接上WiFi了,但是提示“不可上网”,那就把WiFi断开重新连接下. 不行的话就试试下面的办法 一.配 ...

  2. ECMAScript基本语法——⑦js特殊的语法

    定义方法 无法弹出因为是局部变量 可以弹出因为是全局变量 这样写可读性比上面的高

  3. mybatis - 基于拦截器修改执行语句中的ResultMap映射关系

    拦截器介绍 mybatis提供了@Intercepts注解允许开发者对mybatis的执行器Executor进行拦截. Executor接口方法主要有update.query.commit.rollb ...

  4. [POI2010] GRA-The Minima Game - 贪心,dp,博弈论

    给出N个正整数,AB两个人轮流取数,A先取.每次可以取任意多个数,直到N个数都被取走.每次获得的得分为取的数中的最小值,A和B的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况下,最终A的 ...

  5. 题解 P5733 【【深基6.例1】自动修正】

    题目传送门 分析: 1.这道题可以说是一个字符串的练习好题.我们先来了解一下字符串.在这道题中,建议使用\(string\) \(string\)是\(C++\).\(java\).\(VB\)等编程 ...

  6. JavaSwing开发简单的银行管理系统 附源码

    开发环境: Windows操作系统开发工具: MyEclipse/Eclipse+Jdk+mysql数据库 运行效果图:

  7. docker在windows下和linux下网络底层的一些区别

    windows和linux下的docker运行时的网络结构是有区别的 a.windows下,默认使用Hyper-v创建一个linux虚拟机,承载docker.所以从外向内的路径为: windows - ...

  8. 使用TensorFlow训练模型的基本流程

    本文已在公众号机器视觉与算法建模发布,转载请联系我. 使用TensorFlow的基本流程 本篇文章将介绍使用tensorflow的训练模型的基本流程,包括制作读取TFRecord,训练和保存模型,读取 ...

  9. python 多版本环境

    参考 https://www.cnblogs.com/---JoyceLiuHome/articles/7852871.html 安装 Anaconda集成化环境 https://www.anacon ...

  10. ASP.NET MVC入门到精通——MVC请求管道

    https://www.cnblogs.com/jiekzou/p/4896315.html 本系列目录:ASP.NET MVC4入门到精通系列目录汇总 ASP.NET MVC的请求管道和ASP.NE ...