【Java杂记】反编译:javap,jd-gui,jad 对比总结
关于反编译我们可以使用的工具有三种:javap、jad、jd-gui,本篇我们就来看看这它们的区别是什么。
先来看看测试用的代码,是枚举单例:
然后将该代码进行编译生成 .class 文件。
PS:关于编译,我们这里既可以直接使用 javac 命令,也可以使用 ide 自动编译(包括 maven)。
下面我们就分别使用以上三种方式对上面的代码进行 EnumSingleton.class 反编译,对比得到结果。
1.javap
javap 是 jdk 自带的反编译工具,我们常用的命令有以下两种:
javap -c -l EnumSingleton.class > EnumSingleton.txt // 反编译结果输出到 EnumSingleton.txt(不带常量池)
javap -verbose EnumSingleton.class > EnumSingleton.txt // 反编译结果输出到 EnumSingleton.txt(带常量池)
我们这里采用第一条命令,生成结果如下:
结论:javap 反编译生成的是 JVM 基本指令,当我们想探究 JVM 执行原理时可以使用这种方式。
2.jd-gui
jd-gui 是一个可视化的反编译工具,下载地址,直接下载后就能使用
我们打开它,然后点进去选择要打开的 .class 文件即可,
结论:jd-gui 反编译生成的是我们之前编写的 java 代码,当我们拿到一个项目的 war 包或 jar 想看源码时可以采用这种方式(注:反编译结果可能与源代码有一定出入)。
3.jad
jad 也需要我们手动安装,下载地址,直接选择 windows 版下载解压即可,然后将目录配到环境变量就可以使用了。
jad 的使用也很简单,我们一般直接使用 jad 命令,比如
jad EnumSingleton.class
然后就能自动生成 .jad 文件,
打开来看看:
可以看到,jad 生成的也是 java 代码,但相较于 jd-gui,jad 生成的代码更接近底层执行的结果;就像在这里,我们可以看到,枚举单例的本质就是饿汉式单例,即在 static 代码块完成了实例的创建及初始化。
结论:jad 反编译生成的是更贴近底层执行的 java 代码,当我们想探究底层执行原理,但直接看 JVM 指令吃力时,可以退而求其次采用这种方式。
还没有评论,来说两句吧...