当java应用程序在运行过程中遇到问题时,一般会抛出异常并打印堆栈信息,这些堆栈信息链中常常可以看到一些二方包和三方包。在排查问题时,很多时候我们需要查看这些二方包和三方包的源码。二方包是公司内部其它部门的产出物,虽然折腾些但协调下一般还是能查看到源码的;三方包如果是开源的项目,也能找到源码;但对于非开源项目的 jar 包,如果想查看源码,就不得不用到反编译工具了。

目前市面上常见的java反编译工具,及其官方链接如下:

jad:  https://varaneckas.com/jad/
JadClipse: 基于jad 的适用于eclipse 的插件:http://jadclipse.sourceforge.net/wiki/index.php/Main_Page

jd-gui:  http://java-decompiler.github.io/

其中 jd-gui是 jd project 名下的产品,jd project名下包括了3款具体产品,如下图所示:

java反编译工具最好 最好用的java反编译软件_反编译

除此之外,IntelliJ IDEA 也有自己的反编译插件 java bytecode decompiler,如下如所示:

java反编译工具最好 最好用的java反编译软件_java_02

在此详细介绍下 jd project:Java Decompiler 项目 ”旨在开发一些工具,以便反编译和分析Java 5以及更高本的Java的“字节代码”。该项目下包括三款具体产品:

JD-Core:是个library 库,可以用来从一个或多个“.class”文件中重建Java源代码;

JD-GUI:是图形化的反编译工具,可单独使用,内部整合了jd-core;

JD-Eclipse:是适用于Eclipse平台的反编译插件,内部整合了jd-core;
注意:原来jd还有个JD-IntelliJ,是适用于IntelliJ IDEA 平台的反编译插件,内部同样整合了jd-core,但该产品目前已经不再更新了,再jd官网看不到它的影子,在 IntelliJ Plugin官网还能看到该插件的影子,但有以下不再出于维护期的说明:

java反编译工具最好 最好用的java反编译软件_反编译_03

java反编译工具最好 最好用的java反编译软件_java_04

笔者比较推荐使用jd-gui,该工具是图形化的,下载下来解压即可直接适用同时该工具支持拖拉操作,支持 class/ jar/war/ear/zip等文件类型,也支持层次性地查看class和moduel:

java反编译工具最好 最好用的java反编译软件_反编译_05

java反编译工具最好 最好用的java反编译软件_maven_06

除此之外,jd-gui还支持搜索变量/常量/方法名等,这是很实用的,如下图所示通过方法名搜索到了所有包含该方法的类,也展示了期所在的包路径等详细信息,直接点击即可查看相关源码:

java反编译工具最好 最好用的java反编译软件_java反编译工具最好_07

jd-gui也支持导出反编译得来的源代码,如下如所示,导出后是压缩格式的源码包,直接解压后,即可作为工程导入ide工具,分析查看源码:

java反编译工具最好 最好用的java反编译软件_java反编译工具最好_08

java反编译工具最好 最好用的java反编译软件_maven_09

java反编译工具最好 最好用的java反编译软件_maven_10

相对来说,使用IDEA自带的反编译插件JetBrains Decompiler,反编译jar包并导入查看源码,就相对繁琐一些,涉及到以下步骤:
首先确保IDEA安装了idea反编译插件 java Bytecode Decompiler(通过【Settings】——>【Plugins】输入Decompiler查看否有安装Java Bytecode Decompiler这个插件);

java反编译工具最好 最好用的java反编译软件_反编译_11

然后定位到该插件的路径,比如:D:\programs\IDEA\IntelliJ2020.1.1\plugins\java-decompiler\lib\java-decompiler.jar;
然后在命令行使用命令反编译 jar 包,(需要首先在jar包同目录下创建一个目录,如decompiler_test文件夹,然后发布命令反编译): java -cp "D:\programs\IDEA\IntelliJ2020.1.1\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true datago-base-1.4.1.jar datax-decompile2
以上命令执行完毕后反编译出来的也是压缩格式的源码包,直接解压后,也可作为工程导入ide工具,分析查看源码。

如上所述,当需要反编译整个二方或三方jar包,而不仅仅是该jar包中某一个或几个class文件,并需要把反编译结果作为工程导入到IDE工具,查看源码分析源码时,jd-gui是个很不错的选择。

相关链接附录:
https://varaneckas.com/jad/http://jadclipse.sourceforge.net/wiki/index.php/Main_Page
http://java-decompiler.github.io/
https://plugins.jetbrains.com/