前言
今天推荐一个老牌的,易用的,有助学习编译过程的反编译工具Jad;
反编译:就是把字节码转换成代码的过程;
官网
国内下载:https://gitee.com/mirrors/jad#/mirrors/jad/blob/master/jad158g.win.zip
注意:下载时候注意选择和自己系统匹配的jad;本文以win10使用为例;
配置环境
下载完成的文件是一个压缩文件,解压之后
- jad.exe :无法直接安装,需要配置环境变量,或者每次使用和要反编译的.class文件放到同一目录下,然后cmd命令cd进入此目录然后在执行命令;
- Readme.txt :使用说明
既然是反编译Java字节码文件,那你肯定配置了jdk环境变量;所以直接把jad.exe文件放到jdk安装路径下的bin目录下即可;
例如我本机的jdk安装目录 D:\IDE\Java\jdk1.8.0_221\bin ,所以直接把jad.exe文件放到 D:\IDE\Java\jdk1.8.0_221\bin目录下即可,此办法相当于公用了jdk配置的环境变量;
验证是否配置成功
cmd命令行输入 jad 如果出现如下说明成功了;
使用
比如我想看枚举类是不是继承了Enum类;
枚举类
public enum Color {
RED, BLUE,GREEN;
}
通过javac或者IDE编译生成字节码Color.class文件;
cmd 命令行中输入
jad -sjava F:\File\Color.class
出现Parsing F:\File\Color.class... Generating Color.java说明反编译成功了;
注意:生成的Color.java 不在F:\File\下,而是在执行这条命令的目录下,所以命令行执行反编译操作时,最好cd进入Color.class所在的目录下(cd F:\File ,F:),这样生成的Color.Java就和反编译前的字节码文件在同一目录下了;
反编译生成的Color.java代码如下
package com.company;
public final class Color extends Enum
{
public static Color[] values()
{
return (Color[])$VALUES.clone();
}
public static Color valueOf(String name)
{
return (Color)Enum.valueOf(com/company/Color, name);
}
private Color(String s, int i)
{
super(s, i);
}
public static final Color RED;
public static final Color BLUE;
public static final Color GREEN;
private static final Color $VALUES[];
static
{
RED = new Color("RED", 0);
BLUE = new Color("BLUE", 1);
GREEN = new Color("GREEN", 2);
$VALUES = (new Color[] {
RED, BLUE, GREEN
});
}
}
其他常用命令:
-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)
查看所有命令
cmd 命令行执行 jad