多少不凡、只因不甘。
工作中最常遇见的是查看某些想查看某些依赖源码时,又不能下载源码,往往只能通过提供的 jar 文件反编译查看。
一般情况下如果只是查看,通常有两种方式:
- 通过 idea 编辑器引入mvn依赖可直接查看 jar 中的文件,如果是class文件可直接拖入idea编辑器中就可查看
- 下载 JD-GUI 编辑器(是一个class文件反编译java文件软件),可直接打开 jar 文件、class文件、class文件目录
- JD-GUI 具体软件如下图样式
很特殊的情况下,如果我们的源码丢了,只有线上跑的 class文件
这个时候就需要通过class文件 反编译成 java文件使用,以满足我们对现有代码的二次开发功能。
所以我们需要批量将整个目录下的class文件编译成java源文件。
以上两种方式我们可以一个一个文件反编译后通过拷贝保存的方式将文件恢复,如果数量不多只有几个或者几十个还好,但是如果有上百或者上千个文件,这将是很大的工作量。
索性 JD-GUI 反编译工具 提供了批量保存的功能
JD-GUI 编辑工具反编译后批量保存成java文件
具体操作步骤如下:
- 将存放class目录的整个文件都导入到 编辑器中,如果是 jar 文件可直接打开
- 点击 File -> Save All Sources 将整个文件夹下所有class 文件反编译成 java 并且保存,如下图所示
- 选择保存目录即可。
- 如果是保存单个文件,点击 File -> Save Source, 选择保存目录即可。
通过命令将class文件转换成Java文件
命令如下:
//具体命令
jad.exe -r -d c:\src -s java -8 c:\classes\**\*.class
命令行选择的列表
-a - 用JVM字节格式来注解输出
-af - 同 -a,但是注解的时候用全名称
-clear - 清除所有的前缀
-b - 输出多于的括号 (e.g., if(a) { b(); }, default: no)
-d <dir> - 指定输出文件的文件目录
-dead -试图反编译代码的dead 部分(default: no)
-disass - 不用用字节码的方式反编译 (no JAVA source generated)
-f - 输出整个的名字,无论是类还是方法
-ff -输出类的成员在方法之前 (default: after methods)
-i - 输出所有的变量的缺省的最初值
-l<num> - 将strings分割成指定数目的块的字符 (default: no)
-lnc - 将输出文件用行号来注解 (default: no)
-nl - 分割strings用新行字符 newline character (default: no)
-nodos -不要去检查class文件是否以dos方式写 (CR before NL, default: check)
-nocast - 不要生成辅助文件
-nocode -不要生成方法的源代码
-noconv - 不要转换java的定义符 (default: do)
-noctor - 不允许空的构造器存在
-noinner -关掉对内部类的支持 (default: turn on)
-nolvt - 忽略局部变量的表信息
-nonlb - 不要输出一个新行在打开一个括号之前 (default: do)
-o - 无需确认直接覆盖输出 (default: no)
-p - 发送反编译代码到标准输出 STDOUT (e.g., for piping)