【Java杂记】反编译:javap,jd-gui,jad 对比总结

以你之姓@ 2023-01-18 02:24 274阅读 0赞

关于反编译我们可以使用的工具有三种:javap、jad、jd-gui,本篇我们就来看看这它们的区别是什么。

先来看看测试用的代码,是枚举单例:

在这里插入图片描述
然后将该代码进行编译生成 .class 文件。

在这里插入图片描述

PS:关于编译,我们这里既可以直接使用 javac 命令,也可以使用 ide 自动编译(包括 maven)。

下面我们就分别使用以上三种方式对上面的代码进行 EnumSingleton.class 反编译,对比得到结果。

1.javap

javap 是 jdk 自带的反编译工具,我们常用的命令有以下两种:

  1. javap -c -l EnumSingleton.class > EnumSingleton.txt // 反编译结果输出到 EnumSingleton.txt(不带常量池)
  2. javap -verbose EnumSingleton.class > EnumSingleton.txt // 反编译结果输出到 EnumSingleton.txt(带常量池)

我们这里采用第一条命令,生成结果如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzNTkyNw_size_16_color_FFFFFF_t_70_pic_center 1

结论:javap 反编译生成的是 JVM 基本指令,当我们想探究 JVM 执行原理时可以使用这种方式。

2.jd-gui

jd-gui 是一个可视化的反编译工具,下载地址,直接下载后就能使用

在这里插入图片描述
我们打开它,然后点进去选择要打开的 .class 文件即可,
在这里插入图片描述

结论:jd-gui 反编译生成的是我们之前编写的 java 代码,当我们拿到一个项目的 war 包或 jar 想看源码时可以采用这种方式(注:反编译结果可能与源代码有一定出入)。

3.jad

jad 也需要我们手动安装,下载地址,直接选择 windows 版下载解压即可,然后将目录配到环境变量就可以使用了。

在这里插入图片描述
jad 的使用也很简单,我们一般直接使用 jad 命令,比如

  1. jad EnumSingleton.class

然后就能自动生成 .jad 文件,
在这里插入图片描述
打开来看看:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzNTkyNw_size_16_color_FFFFFF_t_70_pic_center 2

可以看到,jad 生成的也是 java 代码,但相较于 jd-gui,jad 生成的代码更接近底层执行的结果;就像在这里,我们可以看到,枚举单例的本质就是饿汉式单例,即在 static 代码块完成了实例的创建及初始化。

结论:jad 反编译生成的是更贴近底层执行的 java 代码,当我们想探究底层执行原理,但直接看 JVM 指令吃力时,可以退而求其次采用这种方式。

发表评论

表情:
评论列表 (有 0 条评论,274人围观)

还没有评论,来说两句吧...

相关阅读