从字节码层面,解析 Java 布尔型的实现原理
最近在系统回顾学习 Java 虚拟机方面的知识,其中想到一个很有意思的问题:布尔型在虚拟机中到底是什么类型?
要想解答这个问题,我们看 JDK 的源码是无法解决源码的,我们必须深入到 class 文件中才能解决问题。于是他给出了这么一道题:
public class Foo{static boolean flag;public static void main(String[] args){flag = true; if(flag){System.out.println("Hello, Java!");}if(flag == true){System.out.println("Hello, JVM!");}}
}
这道题很简单,结果是输出:
Hello, Java!
Hello, JVM!
但我们要深入到 class 文件中去看看 JVM 对于这段代码,它到底是怎么执行字节码指令的。于是我们使用 javac 命令得到它的 class 字节码文件:
javac Foo.java
字节码文件都是十六进制的字符集合,我们一般可以用 javap 命令来实现反汇编工作。但这次我们使用另一个工具,即 asmtools。它是 OpenJDK 提供的另一个反汇编工具。
java -cp /path/to/asmtools.jar org.openjdk.asmtools.jdis.Main Foo.class > Foo.jasm.1
注:上面需要下载 asmtools 这个 Jar 包,下载地址:asmtools - Code Tools - OpenJDK Wiki
这个 asmtools jar包的下载地址不是很好找,我这里啰嗦一下讲讲在哪里下载。打开上面的链接后可以看到下面的图:
点击红色框框的release:
之后点击下载 asmtools*.tar.gz 文件,解压之后就能够看到对应的 asmtools 文件了。
上面这行命令其实就是把字节码文件反汇编一下,然后存在 Foo.jasm.1 文件里。我们打开 Foo.jasm.1 文件可以看到下面的内容:
其实这个文件就是一系列字节码指令的集合,上面 main 方法中的字节码指令我们可以分两部分来看。
第一部分的字节码指令是这样的:
点击图片可以看到每一个字节码指令的详细解释
其实这几行的逻辑对应下面这块源码:
if(flag){System.out.println("Hello, Java!");
}
而第二部分的字节码指令的分析:
点击图片可以看到每一个字节码指令的详细解释
这几行的逻辑对应下面这块源码:
if(flag == true){System.out.println("Hello, JVM!");
}
看完了这两部分的字节码指令,你会发现只有 iload_1 和 iconst_1 字节码指令,而这两个字节码指令是对 int 类型数据的处理。所以我们可以知道,在 JVM 中 boolean 类型就是用 int 类型来存储的。
其实还有一个方法可以很直观地看出布尔型是使用整型表示的,那就是将 Foo.jasm 文件恢复成 class 文件。运行下面的命令,将其恢复成 class 文件:
java -cp asmtools.jar org.openjdk.asmtools.jasm.Main Foo.jasm
你会发现目录下生成了一个 Foo.class 文件,我们使用 JD-GUI 工具打开它:
你会发现原来是布尔型的变量,现在变成了整型。原来的 true 现在是 1 了。
总结一下,其实布尔型在 Java 虚拟机是用整型表示的,true 用 1 表示,false 用 0 表示。
转载于:https://www.cnblogs.com/chanshuyi/p/deep_insight_boolean_type_in_jvm.html
从字节码层面,解析 Java 布尔型的实现原理相关推荐
- catch后面的代码会执行吗_字节码层面理解try、catch、finally
面试中经常有关于try.catch.finally相关的问题,今天从字节码层面了解他们的运行流程. 简单代码 直接上测试简单代码,如下图: 这里是一个简单的测试代码,代码中有三个异常和一个finall ...
- 深入理解JVM(三)—— HelloWorld字节码完整解析
目录 1.字节码由来 2.hello代码字节码结构和使用javap -v指令查看字节码结构 2.1 hello代码字节码结构 2.2 javap -v指令查看字节码结构 3.字节码完整解析 3.1 魔 ...
- java字节码文件结构解析
目录 魔数与版本 常量池 类.父类和接口索引集合 字段表集合 方法表集合 属性表集合 Class文件(即字节码文件)以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列, 中间没有分隔符 ...
- java 魔数_Java 字节码结构解析
本文通过解析Class文件中字节码的结构,来加深对Java类文件结构的理解.建议先阅读Java类文件结构解析这篇文章. Test.java package org.tianbin.clazz; pub ...
- Java字节码深入解析
一:Java字节代码的组织形式 类文件{ OxCAFEBABE,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域信息数组, ...
- 深入 JVM 字节码,解析类加载、链接、初始化、创建对象、对象初始化、程序执行的流程
概述: 本文通过引入一道面试题来解析类加载.类链接.类初始化过程,以及创建创建对象.对象初始化和程序执行的过程. 你将收获: 1.精通类加载.类链接.类初始化过程 2.深入源码层面了解类初始化.对象初 ...
- 从字节码层面分析==比较integer和int
public class aaa {public static void main(String[] args) {Integer a = 1;int b = 1;System.out.println ...
- java编译后生成字节码_请问java源文件编译后怎么生成字节码文件?
比如,有的java源程序生成一个字节码文件,带有内部类的生成两个.可是有一种情况怎么回事呢?importjava.awt.*;importjavax.swing.*;importjava.awt.ev ...
- java字节码_掌握Java字节码
java字节码 嘿! Happy Advent:D我是ZeroTurnaround的技术布道者Simon Maple( @sjmaple) . 您知道, JRebel伙计们! 由于编写了类似JRebe ...
最新文章
- 推荐一位零基础转 Python 的大佬
- 台式电脑已连接但无法上网_电脑无法上网?五步帮你解决!
- 转帖:ESB(Enterprise Service Bus)
- 带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分
- 微服务实战——Spring Cloud 第四篇 将服务注册到Eureka Server上
- JavaScript中this的指向问题及面试题你掌握了吗?
- 25 个很棒的 Python 脚本合集(迷你项目) - PDF 下载
- 【短视频音乐解析源码】在线解析抖音短视频音乐BGM源码+解析后自动播放mp3
- 安卓坐标系转换之二:旋转角(欧拉角)
- 【Java基础】Java网络编程基础
- 计算机相关的外国文献,计算机发参考文献外国 计算机发参考文献有哪些
- java.lang.NoClassDefFoundError: org/apache/hive/service/cli/thrift/TCLIService$Iface
- A problem occurred starting process 'command 'xxx
- 【数值预报】按时间维度合并/重新生成nc、grib网格数据(按天、小时组织的文件合并成按月组织文件)
- html5 canvas 图片移动端,支持移动端的HTML5 Canvas逼真黑板特效
- MFS分布式文件系统一
- SSD固态硬盘颗粒SLC MLC TLC QLC有什么区别
- 企业中小型机房UPS电源及环境微信云监控解决方案
- 最新ThinkPHP内核全行业小程序运营管理系统源码 DIY布局 一键生成小程序
- Visual Studio 2019 Community 许可证过期