Java 如何进行反编译生成.java文件(javap、jad下载安装使用)

1. 前言

  1. 为什么我们需要进行反编译?
    因为有时候需要更加深入了解代码的具体细节,而只是看class字节码文件我们又看不懂,因此则需要反编译。
  2. 常用的反编译工具:javap、jad

2. javap

  1. 这是jdk自带的工具,可以对代码反编译,查看java编译器生成的字节码文件。

  2. 举个例子:
    下面这是个枚举代码:

    public enum TypeEnum {
        A("1"),
        B("2"),
        C("3");
    
        private String name;
    
        private TypeEnum(String name) {
            this.name = name;
        }
    
        public String getName(){
            return this.name;
        }
    }
    

    经过编译之后生成class文件是TypeEnum.class,我们使用javap命令对其进行反编译:
    在这里插入图片描述
    如上图,似乎我们也就只能看见一些基本的属性,方法定义啥的,看不出什么东西。
    因此,使用javap -c TypeEnum.class 命令,让其生成更加详细的内容:
    在这里插入图片描述
    如上图:javap生成的内容其实是让我们可以理解的一些字节码,具体内容都比较详细,可以从这里看得出代码的一些隐藏的细节。

3. javap的小问题

  1. 当你掌握一小部分字节码有所掌握,确实javap可以看到具体的细节,但是总让人感觉看的不是很舒服,不是很习惯。
  2. 因此,我们需要额外的工具,进行反编译并生成java文件的。

4. javap 与 jad的区别

  1. javap生成的并不是java文件,而是可以让我们看得懂的字节码文件。
  2. jad生成的是java文件,更加一目了然。

5. jad工具

1. 安装

  1. jad是一个的反编译工具,只要下载一个执行工具,就可以实现对class文件的反编译了。
  2. 下载地址:https://varaneckas.com/jad/
    在这里插入图片描述
  3. 下载好的压缩包,解压出来,我们会看见两个文件:
    在这里插入图片描述
  4. 设置环境变量。
    在这里插入图片描述
  5. 测试:
    在这里插入图片描述

2. 具体使用

  1. 输入jad TypeEnum.class。之后就会在 TypeEnum.class所在路径生成一个TypeEnum.jad文件。

  2. 之后用记事本方式打开该文件,或者将TypeEnum.jad改为TypeEnum.Java,文件内容不变。

  3. 或者输入jad -sJava TypeEnum.class,反编译结果以.Java为扩展名。

  4. 例子:
    在这里插入图片描述
    在这里插入图片描述

  5. 查看反编译生成的TypeEnum.java 文件。也可以具体看见代码隐藏的细节。比如static 代码块执行了什么东西,一目了然。

    public final class TypeEnum extends Enum
    {
    
        public static TypeEnum[] values()
        {
            return (TypeEnum[])$VALUES.clone();
        }
    
        public static TypeEnum valueOf(String name)
        {
            return (TypeEnum)Enum.valueOf(com/jin/king/TestEnums/TypeEnum, name);
        }
    
        private TypeEnum(String s, int i, String name)
        {
            super(s, i);
            this.name = name;
        }
    
        public String getName()
        {
            return name;
        }
    
        public static final TypeEnum A;
        public static final TypeEnum B;
        public static final TypeEnum C;
        private String name;
        private static final TypeEnum $VALUES[];
    
        static 
        {
            A = new TypeEnum("A", 0, "1");
            B = new TypeEnum("B", 1, "2");
            C = new TypeEnum("C", 2, "3");
            $VALUES = (new TypeEnum[] {
                A, B, C
            });
        }
    }
    
    

6. 参考文章

  1. https://www.cnblogs.com/helloworld2048/p/10916316.html 这个文章写的比较详细,大家可以看看。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值