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

最新文章

  1. PL/SQL连接错误:ora-12705:cannot access NLS data files or invalid environment specified
  2. protocol的简单写法
  3. linux查看负载
  4. JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API
  5. jQuery 一些小技巧
  6. mime type 概要介绍
  7. 《STL源码剖析》笔记
  8. constant属性详解
  9. app被Rejected 的各种原因翻译(转)
  10. [翻译]如何用YII写出安全的WEB应用
  11. css3中display和box小结
  12. [置顶] github 出现 Permission denied (publickey)的解决
  13. eclipse 鲜为人知的调试技巧,你用过多少
  14. hibernate深度学习 游离状态 HQL
  15. SpringMVC工作原理示意图
  16. crucible 的 破解
  17. [geos]Geometry基本的几何对象
  18. Docker:Deploy your app
  19. 面向对象 【类库】【委托】【is as运算符】
  20. Oracle EBS OPM 生产批创建事务处理

热门文章

  1. RHEL7.3安装mysql5.7
  2. linux正则表达式(基础正则表达式+扩展正则表达式)
  3. orcl 中upper()和lower()和initcap()的用法
  4. orcl 复杂查询
  5. python的学习之路day7-socket网络编程
  6. 第二次作业 单例模式的SessionFactory以及线程安全的session
  7. python3: 数字日期和时间(1)
  8. 【13】python time时间模块知识点备查
  9. 【转】开篇python--明白python文件如何组织,理解建立源文件
  10. Python os.md