最近在系统回顾学习 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 表示。

从字节码层面,解析 Java 布尔型的实现原理的更多相关文章

  1. 字节码层面深入分析Java枚举类

    枚举类的使用 定义一个简单的枚举类,其中包含若干枚举常量,示例如下: public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FR ...

  2. Java字节码例子解析

    举个简单的例子: public class Hello {     public static void main(String[] args) {         String string1 = ...

  3. i++ 与 ++i 的从字节码层面看二者的区别

    /** * javap命令可以对class反汇编得到其字节码文件(此命令并不是jdk8开始的,只不过jdk8中对工具进行加强,增加了一些参数,可通过 javap -help了解) * * 注意: * ...

  4. 透过字节码生成审视Java动态代理运作机制

    对于动态代理我想应该大家都不陌生,就是可以动态去代理实现某个接口的类来干一些我们自己想要的功能,但是在字节码层面它的表现是如何的呢?既然目前刚好在研究字节码相关的东东,有必要对其从字节码角度来审视一下 ...

  5. i = i++ 在java字节码层面的分析

    有这么一段代码: package zl.test; public class PcodeTest { /** * @param args */ public static void main(Stri ...

  6. 《深入理解Java虚拟机》-----第8章 虚拟机字节码执行引擎——Java高级开发必须懂的

    概述 执行引擎是Java虚拟机最核心的组成部分之一.“虚拟机”是一个相对于“物理机”的概念 ,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上的,而 ...

  7. 从字节码层面看“HelloWorld” (转)

    一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...

  8. 从字节码层面看“HelloWorld”

    一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...

  9. 【转】动态字节码技术跟踪Java程序

    Whats is Java Agent?   .. java.lang.instrument.Instrumentation 之前有写 基于AOP的日志调试 讨论一种跟踪Java程序的方法, 但不是很 ...

随机推荐

  1. maven+spring+junit测试要注意的事情

    使用maven方式创建webapp工程的资料网上一大堆,在这里也不详细说了.在创建完成之后,里面说到要转动态web工程时要切换为3.0版本,但是我本地切换不了,网上的方法好像也没用,暂时也没用到这块. ...

  2. nmcli 命令使用

    nmcli 是 NetworkManager 的控制客户端,通过 man 查看可知: NMCLI(1) General Commands Manual NMCLI(1) NAME nmcli - co ...

  3. [Spark RDD_add_2] Spark RDD 分区补充内容

    [Spark & Hadoop 的分区] Spark 的分区是切片的个数,每个 RDD 都有自己的分区数. Hadoop 的分区指的是 Reduce 的个数,是 Map 过程中对 Key 进行 ...

  4. opengl 实体和网格绘图函数(基础)(转)

    http://blog.csdn.net/he_wen_jian/article/details/8594880 GLUT工具箱提供几种图形3维图形的函数: void glutWireSphere(G ...

  5. Hexo搭建博客笔记

    Hexo搭建(建议看ppt:https://files.cnblogs.com/files/-SANG/%E4%BD%A0%E7%9A%84%E7%8C%AB.pptx ) 安装Git https:/ ...

  6. November 16th, 2017 Week 46th Thursday

    Don't you wonder sometimes, what might have happened if you tried. 有时候,你会不会想,如果当初试一试会怎么样? If I had t ...

  7. Spring boot整合Hive

    使用Spring boot整合Hive,在启动Spring boot项目时,报出异常: java.lang.NoSuchMethodError: org.eclipse.jetty.servlet.S ...

  8. vue2.0学习笔记之组件

    [易错点]:  1.   组件内html代码片段超过一个标签时必须套一个根元素,即template模板子元素只能是一个. 2.   组件名称采用横杠间隔命名时,第一个字母大写会报错.   写法一:全局 ...

  9. Android:你要的WebView与 JS 交互方式 都在这里了

    前言 现在很多App里都内置了Web网页(Hybrid App),比如说很多电商平台,淘宝.京东.聚划算等等,如下图 上述功能是由Android的WebView实现的,其中涉及到Android客户端与 ...

  10. Effective MySQL之SQL语句最优化——读书笔记之二

    第二章,基本的分析命令 本章简单介绍了如下几个基本的MySQL分析命令: EXPLAIN命令 生成QEP不是确定的 QEP不会绑定给一个SQL或者存储过程,而是在执行的时候根据实际情况生成 可以通过Q ...