博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从字节码层面,解析 Java 布尔型的实现原理
阅读量:6207 次
发布时间:2019-06-21

本文共 1413 字,大约阅读时间需要 4 分钟。

最近在系统回顾学习 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 包,下载地址:

上面这行命令其实就是把字节码文件反汇编一下,然后存在 Foo.jasm.1 文件里。我们打开 Foo.jasm.1 文件可以看到下面的内容:

其实这个文件就是一系列字节码指令的集合,上面 main 方法中的字节码指令我们可以分两部分来看。接下来我们一部分一部分来分析:

(放大图片查看每个指令集的作用)

其实这几行的逻辑对应下面这块源码:

if(flag){    System.out.println("Hello, Java!");}复制代码

而第二部分的字节码指令的分析:

(放大图片查看每个指令集的作用)

这几行的逻辑对应下面这块源码:

if(flag == true){    System.out.println("Hello, JVM!");}复制代码

经过这么一分析,你会发现在 Java 虚拟机中是不存在布尔值这一类型的,他们都被整型来替代了。

其实还有一个方法可以很直观地看出布尔型是使用整型表示的,那就是将 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 表示。

转载地址:http://uokja.baihongyu.com/

你可能感兴趣的文章
traceroute和tracert的区别
查看>>
zabbix客户端安装
查看>>
外网访问内网Apache HTTP Server
查看>>
linux 系统优化
查看>>
第二次部署Zabbix 3.0使用percona模板监控MySQL,遇到的问题和解决过程
查看>>
servlet在获取PrintWiriter并使用后是否需要关闭
查看>>
Android笔记:关于so文件
查看>>
System.Threading.ThreadAbortException: 正在中止线程。
查看>>
安装Centos6.9出现故障
查看>>
Android 自定义Toolbar/ActionBar视图左边有空白
查看>>
Django---forms各种类型表单使用
查看>>
我的友情链接
查看>>
python3 functions
查看>>
CentOS-6.5(X64)使用yum安装LAMP环境
查看>>
shell笔记之sed编辑器的基础用法(下)
查看>>
JavaScript中的一些特殊用法(二)
查看>>
Exchange 2013 传输架构
查看>>
android 新adt多一个项目的解释
查看>>
rsync
查看>>
[译]Android 安全概述之简介
查看>>