一 什么是字节码

java中通过编译, 会将我们程序员编写的文件转换成为一种 .class结尾的文件,我们称之为字节码文件.它是一种二进制文件(很明显是给计算机看的文件),是Java虚拟机中运行的文件.

1.1 如何在IDEA中查看标准的,未经过IDEA反编译过的 .calss文件

(1) javap
IDEA中在 Terminal 终端中,我们通过 javap 命令来查看某个java文件的字节码文件

(2) javap -c
javap -c能够将字节码文件中助记符呈现出来,能够让我们更加详细的看到字节码文件的原貌

(3) javap -verbose
使用 javap -verbose命令分析一个字节码文件时, 将会分析该字节码文件的魔数,版本号,类信息,类的构造方法,类中的方法信息,类变量与成员变量等信息;

1.2 Java字节码整体结构

字节数 名称 含义
4个字节 Magic Number 魔数,值为0xCAFEBABE, 是Java的创始人 James Gosling 制定
2+2个字节 Version 包括minor_version和major_version; minor_version:1.1(45),1.2(46)…1.8(52),指令多年不变,但是版本号每次都发生变化
2+n个字节 Constant Pool 包括字符串常量和数值常量等
2个字节 This Class Name 当前类的名字
2个字节 Super Class Name 父类的名字
2+n个字节 Interfaces 接口相关的信息(2部分组成:前两个字节表示有几个接口,后n个字节表示具体的每一个接口)
2+n个字节 Fields 当前类的成员变量信息,组成同上
2+n个字节 Methods 当前类的方法的信息
2+n个字节 Attributes 当前类的附加的属性

普及两个概念

  • 字节数据直接量

这是基本的数据类型, 共细分为 u1, u2, u4, u8四种, 分别代表连续的1个字节,2个字节,4个字节,8个字节组成的整体数据;

  • 表(数组)

表是由多个基本数据或其他表,按照既定顺序组成的大数据集合. 表是有结构的, 它的结构体现在: 组成表的分析所在的位置和顺序都是已经严格定义好的;

1.3 通过工具WinHex打开字节码文件,查看16进制文件内容

1.4 Java字节码结构解读

  • 魔数

所有的 .class字节码文件的前4个字节都是魔数, 魔数值为固定值:0xCAFEBABE(cafe babe)

  • 版本信息

魔数之后的4个字节为版本信息, 前两个字节表示 minor version(次版本号), 后两个字节表示 major_version(主版本号). 这里 1.3中4,5,6,7 四个字节表示版本号,为 00 00 00 34,换算成10进制,表示次版本号(0000) 为0, 主版本号(0034)为52(52对应java版本为1.8),所以该文件的Java版本号为:1.8.0(这个在1.2的javap -verbose编译的信息中可以看到)

  • 常量池(Constant Pool)

紧接着主版本号之后的就是常量池入口. 一个Java类中定义的很多信息都是由常量池来维护和描述的. 可以将常量池看做是 class文件的资源仓库. 比如说 Java类中定义的方法与变量信息. 都是存储在常量池中. 常量池中主要存储两类常量: 字面量符号引用. 字面量如文本字符串, java中声明为final的常量值等, 而符号引用如类和接口的全限定名,字段的名称和描述符,方法的名称和描述符等.

每个常量其结构为, 1(个字节) + n(个字节), 表示 常量类型 + 具体常量内容
class字节码文件的 16进制文件中 2位 1字节
常量类型根据下图Class文件结构中常量池中11中数据类型的结构总表来确定, 每个数据类型的结构都有明确标出

  • 常量池的总体结构

Java类所对应的常量池主要由常量池数量与常量池数组(常量表)这两部分共同构成. 常量池数量紧跟在主版本号后面,占据2个字节; 常量池数组则紧跟在常量池数量之后. 常量池数组与一般的数组不同的是, 常量池数组中不同的元素的类型,结构都是不同的,长度当然也就是不同; 但是, 每一种元素的第一个数据都是一个 u1 类型,该字节是个标志位,兼具一个字节. JVM在解析常量池时, 会根据这个 u1 类型来获取元素的具体类型. 指的注意的是,常量池数组中元素的个数=常量池数-1(其中0暂时不使用),目的是满足某些常量池引值的数据在特定情况下需要表达"不引用任何一个常量池"的含义;根本原因就在于索引为0 也是一个常量(保留常量),只不过它不位于常量表中,这个常量就对应null值,所以常量池的索引从1而非0开始;(1.2图示中从#1开始就是这么个意思)

举个栗子吧,分析一下常量池的第一个常量
具体的字节码内容我们在 1.3通过 winHex工具打开,我们 只分析第一个常量,后面的都是一样的

上图我们分别标记了字节码表的前15个字节,共分成4各部分, 分别表示为 魔数 主次版本号 常量池数量 第一个常量池信息(这个我是根据上图 “Class文件结构中常量池中11中数据类型的结构总表” 得到的),因此我们只需要分析字节码0A 0004 0015
根据上面所述,第一个字节0A(换算成10进制为10),是该常量在 “常量池中11中数据类型的结构总表” 对应的一个类型, 为CONSTANT_Methodref_info,其包含三个部分,如下表,我们直接将解读内容也列举出来

名称 对应字节码 解读
tag(u1即占一个字节) 0A 这个值需要去结构总表中找,即我们已经找到的CONSTANT_Methodref_info
index(u2)具体含义看"结构总表" 0004 对应常量池内容 java/lang/Object
index(u2) 0015(换算成10进制为 21) 对应常量池内容 <init> ()V

表中说的常量池, 就是我们在 1.2中通过javap -verbose编译字节码文件,得到的内容中的 Constant pool里面的数据

解读第一个常量,就是Object类的构造方法. 因为<init>的意思就是构造函数而()V意思是不接受任何参数,无返回值; 结合一下,就是无参构造方法

其它常量池常量如上炮制即可

  • 描述信息

在 JVM 规范中,每个变量/字段都有描述信息. 描述信息主要的作用是描述字段的数据类型,方法参数列表(包括数量,类型与顺序)与返回值. 根据描述符规则, 基本数据类型和代表无返回值的 void 类型都用一个大写字符 V 来表示, 对象类型则使用字符 L加对象的全限定名来表示. 为了压缩字节码文件的体积,对于基本数据类型, JVM都只使用一个大写字母来表示, 如下所示

【JVM学习笔记】-字节码-第一章(多图,多表,实操)相关推荐

  1. 快学Scala 学习笔记-1: (第一章到第三章)

    第一章. 1.1 Scala解释器(REPL) Scala> 8*5+2 res0: Int = 42 Scala> 0.5 * res0 res1: Double = 21.0 Scal ...

  2. 软考网络管理员学习笔记1之第一章计算机硬件基础

    第一章.计算机硬件基础 1.进制间的转换 [考法分析] 本考点的基本考法是求二进制数.十进制数.八进制数及十六进制数之间的互转 [要点分析] 进制间互转一般是无符号的数 三位二进制的数可以转换成一个八 ...

  3. 《信息安全工程师教程》学习笔记01(第一章)

    第一章 信息安全基础 信息安全概念.信息安全法律法规.信息安全管理基础.信息安全标准化知识. 1.1 信息安全概念 1.1.1 信息安全是信息时代永恒的需求 超级计算机.量子计算机.DNA计算机 14 ...

  4. 学神python全栈学习笔记CMDB系统---第一章 python_cmdb_介绍,项目开始

    第一章 python_cmdb_介绍,项目开始 本节所讲内容: 1.1  python cmdb系统介绍与需求分析 1.2  python cmdb数据库建模 1.3  python cmdb前端基础 ...

  5. 数据结构学习笔记(第六章:图)

    第六章:图 6.1 图的基本概念 6.2 图的存储及基本操作 邻接矩阵法 邻接表法 十字链表 邻接多重表 6.3 图的遍历 广度优先遍历 深度优先搜索 6.4 图的应用 最小生成树 Prim(普里姆) ...

  6. Programming Computer Vision with Python【学习笔记】【第一章】

    第1章 基本的图像操作和处理 1.1 PIL:Python图像处理类库 1.1.1 转换图像格式--save()函数 1.1.2 创建缩略图 1.1.3 复制并粘贴图像区域 1.1.4 调整尺寸和旋转 ...

  7. 微信小程序入门与实战学习(笔记一:第一章)

    什么是微信小程序 张小龙的定义: 1.无需下载安装即可使用 2.用户"用完即走",无需关心是否安装太多应用 3.应用将无处不在,随时可用 [CP2 (人与服务) 小程序] 1.业务 ...

  8. 大话数据结构学习笔记一:第一章

    1.1 基本概念与术语 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合. 数据元素:是组成数据的.有一定意义的基本单位,在计算机中通常作为整体处理 ...

  9. 《编译原理》学习笔记 ·001【第一章:总论】

    注:前言.目录见 https://blog.csdn.net/qq_44220418/article/details/108428971 文章目录 一.编译程序 1.编译程序 2.编译基础设施 3.编 ...

最新文章

  1. 《需求分析》读后感之二
  2. MTD NANDFLASH驱动相关知识介绍
  3. 无线充电系统的功率与效率
  4. 终生受用的十大经典管理理论
  5. smarty模板概念及应用场合
  6. python selenium p_python selenium 常见问题列表
  7. 使用Log4J监控系统日志邮件警报
  8. * 完成随机点名案例;学生姓名都提前写在文件中;:每次敲回车,随机显示一个学生姓名,每人最多显示一次,所有人都显示完了就结束程序;
  9. 美国自称最安全密码:100万年才能破解,却被一位中国宝妈拿下
  10. matlab guide 打开图像并将图像显示到界面
  11. altium 网口差分走线长度_差分信号的优缺点及布线要求
  12. 【线段树】 SPOJ 2713 Can you answer these queries IV
  13. 1078. Bigram 分词
  14. git 删除已经 add 的文件
  15. excel 平滑滚动_我的Excel书——Excel职场应用实战精粹
  16. 利用JavaScript实现京东自动叠蛋糕+淘宝自动领喵币,叠列车+618全民购物
  17. jpg照片太大怎么压缩?教你简单快速完成jpg压缩
  18. ubuntu 安裝deb_ubuntu安装deb
  19. va start linux头文件,va_start/va_end函数-linux
  20. 让PhalApi返回的Json支持中文并且自带格式

热门文章

  1. 一篇今日头条百万阅读量爆文怎么来的,自媒体月收入暴涨10万+
  2. 平面设计零基础怎么设计出一个完美的名片
  3. excel 多列内容合并为一个单元格
  4. Excel:批量将某字符替换为“换行符”
  5. RN:分包/拆包技术调研
  6. ios获取麦克风音频输入数据(PCM)计算DBSPL后与真实值差距很大
  7. linux proftpd mysql_虚拟主机与Proftpd和MySQL(包括配额)在Ubuntu 14.04LTS
  8. windows 注册表(一)注册表相关
  9. 微信公众号网页授权--前端获取code及用户信息(vue)
  10. [LaTex报错解决]Unicode character , (U+FF0C)