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

 更新时间:2023年12月15日 09:59:57   作者:搏·梦  
这篇文章主要介绍了Java进行反编译生成.java文件方式(javap、jad下载安装使用),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1. 前言

为什么我们需要进行反编译?

因为有时候需要更加深入了解代码的具体细节,而只是看class字节码文件我们又看不懂,因此则需要反编译。

常用的反编译工具:javap、jad

2. javap

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

举个例子:

下面这是个枚举代码:

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的小问题

当你掌握一小部分字节码有所掌握,确实javap可以看到具体的细节,但是总让人感觉看的不是很舒服,不是很习惯。

因此,我们需要额外的工具,进行反编译并生成java文件的。

4. javap 与 jad的区别

javap生成的并不是java文件,而是可以让我们看得懂的字节码文件。

jad生成的是java文件,更加一目了然。

5. jad工具

1. 安装

jad是一个的反编译工具,只要下载一个执行工具,就可以实现对class文件的反编译了。

下载地址:https://varaneckas.com/jad/

下载好的压缩包,解压出来,我们会看见两个文件:

设置环境变量。

测试:

2. 具体使用

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

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

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

例子:

查看反编译生成的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
        });
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决@Autowired报错Could not autowire. No beans of ‘XXX‘ type found问题

    解决@Autowired报错Could not autowire. No bea

    介绍了在IDEA中使用@Autowired报错Couldnot autowire. No beans of 'XXX' type found的解决方法,原因是@Autowired在注入service时,由于service接口没有实现类,而mybatis仅需提供Dao接口,导致@Autowired无法识别
    2024-12-12
  • java ArrayList按照同一属性进行分组

    java ArrayList按照同一属性进行分组

    这篇文章主要介绍了java ArrayList按照同一属性进行分组的相关资料,需要的朋友可以参考下
    2017-02-02
  • springboot将lib和jar分离的操作方法

    springboot将lib和jar分离的操作方法

    本文介绍了如何通过优化pom.xml配置来减小Spring Boot项目的jar包大小,主要通过使用spring-boot-maven-plugin和maven-dependency-plugin插件,将依赖库打包到jar中,并通过指定外部lib路径的方式运行jar,从而减小jar包体积,感兴趣的朋友一起看看吧
    2025-02-02
  • java集合_浅谈Iterable和Iterator的区别

    java集合_浅谈Iterable和Iterator的区别

    下面小编就为大家带来一篇java集合_浅谈Iterable和Iterator的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • JDK源码之Vector与HashSet解析

    JDK源码之Vector与HashSet解析

    HashSet、HashMap、ArrayList、LinkedList、Vector这几个在Java编程中经常用到,他们之间有很多联系,有很多相通的地方,我们这次先了解一下Vector与HashSet
    2021-06-06
  • Struts拦截器实现拦截未登陆用户实例解析

    Struts拦截器实现拦截未登陆用户实例解析

    这篇文章主要介绍了Struts拦截器实现拦截未登陆用户实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • JAVA WEB中Servlet和Servlet容器的区别

    JAVA WEB中Servlet和Servlet容器的区别

    这篇文章主要介绍了JAVA WEB中Servlet和Servlet容器的区别,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Spring Boot 启动、停止、重启、状态脚本

    Spring Boot 启动、停止、重启、状态脚本

    今天给大家分享Spring Boot 项目脚本(启动、停止、重启、状态),通过示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-06-06
  • Spring MVC深度解析从原理到实战(最新推荐)

    Spring MVC深度解析从原理到实战(最新推荐)

    MVC是一种经典的软件架构模式,本文给大家介绍Spring MVC深度解析从原理到实战,感兴趣的朋友一起看看吧
    2025-05-05
  • Spring MVC 请求参数处理全解析

    Spring MVC 请求参数处理全解析

    本文主要介绍了Spring框架中处理HTTP请求参数的方法,包括传递单个参数、多个参数、对象参数、数组、集合、JSON数据、路径变量、上传文件、Cookie和Session的获取以及Header的获取,感兴趣的朋友一起看看吧
    2025-12-12

最新评论