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. HTML5表单验证(4个实用的表单美化案例)

    multipart/form-data 在使用包含文件上传控件的表单时,必须使用autocomplete="on" 自动补全功能novalidate 不验证 <form en ...

  2. Spring Boot源码(三):去除Tomcat

    Spring boot中使用的是内置的Tomcat,而不像Spring mvc那样依赖外部tomcat运行项目. spring boot中导入了Tomcat的jar包: 点进一个Spring boot ...

  3. 你是个好人,但不是个好leader

    午餐时间,我翻看朋友圈,浏览到一条朋友A的最新动态,她刚创业半年多的公司因为资金周转不灵.项目搁浅.合伙人撤资等多方面原因,最终倒闭了. 朋友A有着多年的名企工作经验,985大学毕业,在学校时是学霸, ...

  4. 图片选择并使用base64展示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Beego的参数配置

    参数配置 beego 目前支持 INI.XML.JSON.YAML 格式的配置文件解析,但是默认采用了 INI 格式解析,用户可以通过简单的配置就可以获得很大的灵活性.默认配置解析 beego 默认会 ...

  6. Chrome 浏览器相关

    ********* 问题 ********* localhost 通常会使用加密技术来保护您的信息.Google Chrome 此次尝试连接到 localhost 时,此网站发回了异常的错误凭据.这可 ...

  7. phpstudy+phpstorm 浏览器没有解析php文件,直接显示源码

    用phpstorm编辑完项目,右键浏览器预览时页面报错:502 Bad Gateway PhpStorm 2019.1 此时默认打开的地址是:localhost:63339/开头的一长串…… 查资料说 ...

  8. java - synchronized与lock的区别

    synchronized与lock的区别 原始构成 synchronized是关键字属于JVM层面 monitorenter(底层是通过monitor对象来完成,其实wait/notify等对象也依赖 ...

  9. Cenos7 学习笔记

    一.nmtui nmtui——Text User Interface for controlling NetworkManager,这是一个NetworkManager服务的网卡接口配置工具,能实现在 ...

  10. VScode usage

    Common settings editor.minimap.enabled     //close the preview workbench.editor.show tabs  // show f ...