最近在系统回顾学习 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 布尔型的实现原理相关推荐

  1. catch后面的代码会执行吗_字节码层面理解try、catch、finally

    面试中经常有关于try.catch.finally相关的问题,今天从字节码层面了解他们的运行流程. 简单代码 直接上测试简单代码,如下图: 这里是一个简单的测试代码,代码中有三个异常和一个finall ...

  2. 深入理解JVM(三)—— HelloWorld字节码完整解析

    目录 1.字节码由来 2.hello代码字节码结构和使用javap -v指令查看字节码结构 2.1 hello代码字节码结构 2.2 javap -v指令查看字节码结构 3.字节码完整解析 3.1 魔 ...

  3. java字节码文件结构解析

    目录 魔数与版本 常量池 类.父类和接口索引集合 字段表集合 方法表集合 属性表集合 Class文件(即字节码文件)以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列, 中间没有分隔符 ...

  4. java 魔数_Java 字节码结构解析

    本文通过解析Class文件中字节码的结构,来加深对Java类文件结构的理解.建议先阅读Java类文件结构解析这篇文章. Test.java package org.tianbin.clazz; pub ...

  5. Java字节码深入解析

    一:Java字节代码的组织形式 类文件{ OxCAFEBABE,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域信息数组, ...

  6. 深入 JVM 字节码,解析类加载、链接、初始化、创建对象、对象初始化、程序执行的流程

    概述: 本文通过引入一道面试题来解析类加载.类链接.类初始化过程,以及创建创建对象.对象初始化和程序执行的过程. 你将收获: 1.精通类加载.类链接.类初始化过程 2.深入源码层面了解类初始化.对象初 ...

  7. 从字节码层面分析==比较integer和int

    public class aaa {public static void main(String[] args) {Integer a = 1;int b = 1;System.out.println ...

  8. java编译后生成字节码_请问java源文件编译后怎么生成字节码文件?

    比如,有的java源程序生成一个字节码文件,带有内部类的生成两个.可是有一种情况怎么回事呢?importjava.awt.*;importjavax.swing.*;importjava.awt.ev ...

  9. java字节码_掌握Java字节码

    java字节码 嘿! Happy Advent:D我是ZeroTurnaround的技术布道者Simon Maple( @sjmaple) . 您知道, JRebel伙计们! 由于编写了类似JRebe ...

最新文章

  1. 推荐一位零基础转 Python 的大佬
  2. 台式电脑已连接但无法上网_电脑无法上网?五步帮你解决!
  3. 转帖:ESB(Enterprise Service Bus)
  4. 带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分
  5. 微服务实战——Spring Cloud 第四篇 将服务注册到Eureka Server上
  6. JavaScript中this的指向问题及面试题你掌握了吗?
  7. 25 个很棒的 Python 脚本合集(迷你项目) - PDF 下载
  8. 【短视频音乐解析源码】在线解析抖音短视频音乐BGM源码+解析后自动播放mp3
  9. 安卓坐标系转换之二:旋转角(欧拉角)
  10. 【Java基础】Java网络编程基础
  11. 计算机相关的外国文献,计算机发参考文献外国 计算机发参考文献有哪些
  12. java.lang.NoClassDefFoundError: org/apache/hive/service/cli/thrift/TCLIService$Iface
  13. A problem occurred starting process 'command 'xxx
  14. 【数值预报】按时间维度合并/重新生成nc、grib网格数据(按天、小时组织的文件合并成按月组织文件)
  15. html5 canvas 图片移动端,支持移动端的HTML5 Canvas逼真黑板特效
  16. MFS分布式文件系统一
  17. SSD固态硬盘颗粒SLC MLC TLC QLC有什么区别
  18. 企业中小型机房UPS电源及环境微信云监控解决方案
  19. 最新ThinkPHP内核全行业小程序运营管理系统源码 DIY布局 一键生成小程序
  20. Visual Studio 2019 Community 许可证过期

热门文章

  1. shell 脚本实战笔记(7)--集群网络相关知识和环境搭建
  2. 基本排序算法比较与选择
  3. 技术检验检测管理系统之样品检验模块概况(四)
  4. 一天一种设计模式之二-----备忘录模式
  5. 使用RPM安装Mysql5.5找不到配置文件My.cnf
  6. Orchard 之:Widget,兼看 Layer 在权限控制中的作用
  7. wordpress插件列表
  8. 微软Asp.Net架构与项目团队管理建设模型分析
  9. linux多线程select定时器,linux使用select实现精肯定时器详解
  10. Python格式化输出、转义字符、结束符