使用javap命令或者eclipse的Bytecode visualizer插件阅读java字节码文件

阅读java的class文件,最常用的方法是jdk自带的javap命令,但是在eclipse有Bytecode visualizer插件,也可以很好地实现阅读;

直接阅读class文件,能够了解一下代码如何执行的内幕,以下面这个代码为例

package test;

import java.util.List;

public class Test {
	public void test() {
		String a = "x" + "y" + 1;
		String b = "xy1";
		System.out.println(a == b);
	}

	public static void main(String[] args) {
		Test t = new Test();

		t.test();
	}
}

test()方法很多人都知道返回true,但是为什么会这样呢?很多人可能说不清楚。我们分别用两种方法阅读一下它们的字节码;

该文件首先需要被编译,得到了Test.class文件

1、使用javap命令阅读

进入Test.class目录,然后使用javap -v Test.class > out将字节码文件读取后存入out文件,然后用notepad++打开out文件:

test()函数的样子:

bytecode-20150705102150

从字节码可以看到,编译器已经自动的将变量a的值合并在一起,成为了xy1,因此相当于xy1两个字符串的比较,两者都处于常量区,因此相等;

2、使用eclipse的Bytecode visualizer插件阅读

安装好插件之后,首先将其配置一下,以显示最大化的字节码信息

bytecode-visualizer-config

然后打开eclipse的Navigator窗口,找到编译好的Test.class,右键,用字节码方式打开,就会看到更易读的字节码

bytecode-visualizer-show

同时在编辑器的右侧,能够自动查看该段代码的流程图,非常方便;

 

使用这两种方式,就能够查看代码编译后的内幕,对一些奇怪的语法现象,就能够自己找出为什么了

但是在测试的过程中,自己写了个print(List<String> strs)的方法,使用Javap命令和Byte visualizer两者,输出的字节码中,前者带着泛型信息,后者进行了泛型擦除,两者不同,很是奇怪;

相关推荐

《使用javap命令或者eclipse的Bytecode visualizer插件阅读java字节码文件》上有1条评论

评论已关闭。