jad 反编译工具 字节码生成Java文件

前言

今天推荐一个老牌的,易用的,有助学习编译过程的反编译工具Jad;

反编译:就是把字节码转换成代码的过程;

官网

https://varaneckas.com/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

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ang_qq_252390816

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值