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. JS实现登录页密码的显示和隐藏功能

    在登录页经常会用到通过点击文本框的类似小眼睛图片来实现隐藏显示密码的功能,其实实现原理很简单,通过点击事件来改变input的type类型,具体过程看代码: 在没给大家分享实现代码之前,先给大家展示下效 ...

  2. javaweb简单的学生信息录入系统

    讲一下思路,主界面的设计就是用html表单元素,百度查找各个元素的用法,按照自己的想法摆放即可,表单提交后会把数据交给serverlet去处理,在那里定义几个字符串变量来储存获取到的数据,然后按照项目 ...

  3. Deepin Linux折腾输入法

    Deepin Linux 别折腾输入法了 , 很容易把自己整残了 Deepin 自带五笔拼音输入法 , 平时撸码用完全够了 . 但今天突然快捷键不好用了.怎么都切不了英文输入 . 切输入法也不能切到英 ...

  4. vim和emacs

    vim和emacs 在编程界一直有两大神器的传说.这两大神器一个是emacs,一个是vim.一个是神的编辑器,一个是编辑器之神. 程序员的圈子里面也一直流传着一个段子,说是世界上的程序员分为三种.使用 ...

  5. Spark学习之路 (八)SparkCore的调优之开发调优[转]

    前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...

  6. 剑指offer-面试题29-顺时针打印矩阵-矩阵

    /* 题目: 输入一个矩阵,按照从外到内顺时针的顺序依次打印每一个数字. */ /* 思路: 1.将打印矩阵看作是打印一个个从外向内的环. 2.每一个环都有一个起始节点,起始节点的坐标*2小于行数和列 ...

  7. F.Three pahs on a tree

    思路 两次bfs找出树的直径并处理出端点离树上各叶子节点的距离,在直径上找一点的子树叶子p3,使得dis(p1,p2) + dis(p2,p3) + dis(p1,p3)最大 易知上式是路径实长的两倍 ...

  8. VS中关于数据库的操作

    1.数据库迁移 第一步: 第二步: 在窗口中选择项目中的EntitiyFramwork项目(与数据库连接的文件集) 第三步: 输入update-database 二:数据对比 第一步: 第二步:选择需 ...

  9. H5_0016:js获取网络中配置文件中的参数

         //获取网络配置文件中的参数      $.get("https://cdn.com/share.json", function(e) {       //console ...

  10. pytest-测试用例teardown和setup

    setup和teardown对于处理一些前置条件很有帮助 用例运行级别 模块级(setup_moudle/teardown_moudle)开始于模块始末,全局的 所有用例开始前/结束后执行一次(整个. ...