你还在为怎么查看字节码指令而担忧吗?

我们平时编码过程中,可能很少去查看 Java 文件编译后的字节码指令。但是,不管你是因为对技术非常热爱,喜欢刨根问底,还是想在别人面前装X 。我认为,都非常有必要了解一下常见的字节码指令。这对于我们理解代码的运行原理也会很有帮助。

注释会被执行吗?

比如,最近我就看到了二哥(沉默王二)的一篇文章,非常有意思,也让我涨了见识了。且看代码,可能会让你怀疑人生~

public class TestAnno { public static void main(String[] args) { String str = "张三"; // \u000d str="李四"; System.out.println(str); } }

可以猜一下最终打印结果是什么。我来告诉你,结果是: “李四”。What? 这是什么神仙操作。为何会这样,这被注释的代码还能执行?

别光顾着吃惊,我们来看一下为什么打印结果跟我们想象中的略有偏差。

仔细查看,发现注释行中,有一个 \u000d 。这是一个 unicode 码,它代表的是一个换行符。因此,在执行后,就会把 str="李四" 这行代码换行到下一行,从而导致了它也被编译执行。

有的小伙伴就说了,我怎么知道你说的是真是假呢,你这不是瞎说呢吗,一点说服力都没有啊。

好吧,这就需要我们看一下编译后的字节码了,编译器总不能骗我们吧。

查看字节码的两种方式

我们知道,通过 javac 命令,可以把 java 文件编译成 class 文件。然后,想看它的字节码指令,需要用到 javap -c 反编译一下。

但是,每次都通过命令行,还是有一些麻烦。因此,懒人福利来了。这里我提供两种方式,直接在 idea 中就可以查看,非常的方便(果然,懒惰才是促使科技进步的原动力啊)。

配置 External Tools

这种方式,其实就是先配置一下,JDK 中 javap 命令的位置,然后让 idea 帮我们自动执行 javap 命令。

找到 idea 的菜单栏,File --> Settings 。然后找到 External Tools 。

你还在为怎么查看字节码指令而担忧吗?

点击加号,添加一个 tool ,里边的配置项,如下,

你还在为怎么查看字节码指令而担忧吗?

Name,就给当前 tool 起一个名字好了,用于使用时,在右键菜单选项中展示。

Decriptions,描述此功能,别到时候你自己都忘了当前配置这个东西是用来干嘛的了。

Program:电脑本机 javap 命令的绝对路径。

Arguments:填写 -c $FileNameWithoutExtension$.class 就可以,代表编译的class文件。

Working directory:填写 $OutputPath$/$FileDirRelativeToSourcepath$ ,代表class文件的工作目录。

配置完成了,可以在idea中,直接右键,选择配置中 Name 对应的选项。

你还在为怎么查看字节码指令而担忧吗?

此时 ,就可以打印出当前类编译后的字节码指令。

你还在为怎么查看字节码指令而担忧吗?

我们稍后再来分析里边的具体含义。下边,还有另外一种使用插件的方式,来查看字节码。而且功能更加强大。

jclasslib bytecode viewer 插件

同上,在 idea 的 setting 菜单,找到 Plugins 插件项,然后搜索这个插件。

你还在为怎么查看字节码指令而担忧吗?

安装之后,并重启 idea ,就可以生效了。

使用的时候,在 View 菜单,找到 show bytecode with jclasslib。

你还在为怎么查看字节码指令而担忧吗?

它可以查看基本信息,常量池,接口,属性,方法等信息。如下,找到我们对应的 main 方法。

你还在为怎么查看字节码指令而担忧吗?

这个插件还有一个好处,就是当我们不知道某个指令是什么意思的时候,直接鼠标在指令上边单击,就可以链接到官方的解释。如,不知道第一行 ldc 什么意思,直接单击 ldc 就可以跳转到 oracle 官网对应命令的解释。这非常有利用我们学习此命令。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxzsg.html