• 反编译SpringBoot项目


    项目缺失源码(外包项目没拿到源码 -_- ),但服务器上有项目的war包,然后需要通过war包反编译出项目源码进行项目的二次开发。

    思路

    项目采用SpringBoot2 + MybatisPlus框架开发,pom.xml、Mapper.xml等资源文件可以直接从war包中提取,主要就是要class字节码文件反编译回java源文件,war包结构如下:

    ├─META-INF          # 目录存放应用打包信息(Maven坐标、pom文件)和MANIFEST.MF文件
    │  ├─MANIFEST.MF  
    │  ├─maven          # 这里面可以获得项目的 pom.xml 文件
    ├─WEB-INF
    │  ├─classes        # 目录存放应用编译后的class、application.yml、mapper.xml文件
    │  ├─lib            # 目录存放应用依赖的第三方JAR包文件
    ├─org               # 目录存放SpringBoot相关class文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 首先我们创建一个空的Maven项目
    • 从war包中获取pom.xml文件替换新建项目的pom.xml文件
    • 将wat包中 WEB-INF/classes 下的静态资源文件(排除class文件)复制到新项目的 src/main/resources 目录下
    • 将class文件反编译为java源文件后复制到新项目的 src/main/java 目录下(具体操作后面介绍)
    • 编译新项目,处理maven依赖问题以及反编译代码问题

    如果项目pom.xml中存在共有Maven仓库不存在的依赖时,我们可以再 wat 包中 WEB-INF/lib 目录下找到对应的jar 文件,然后发布到我们的私有Maven仓库就可以解决了。

    反编译工具的选择

    fernflower

    参考 fernflower idea内置的反编译工具 对class 文件进行反编译,

    结果发现泛型丢失,如下图:
    反编译出来的Java源文件
    我直接用idea(2020.2)打开class文件可以看到是有泛型的:
    正确的Java源文件
    可能和fernflower版本有问题,参考使用idea自带的反编译工具 [FernFlower]Java 原文件时有泛型的。

    java -cp 参数1 org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true 参数2 参数3
    
    • 1

    参数说明:

    • 参数1。IDEA安装目录下的反编译插件“java-decompiler.jar”所在路径,需要加上双引号。示例:“E:\IntelliJ IDEA 2020.2.2\plugins\java-decompiler\lib\java-decompiler.jar”
    • 参数2。需要反编译的文件所在目录,不加双引号。示例:E:\exercise\reflect
    • 参数3。反编译后的文件输出目录,该目录需自己提前创建好,需要加上双引号。示例:“E:\exercise\reflect\test”
      完整命令示例:java -cp D:\JetBrains\apps\IDEA-U\ch-0\202.7660.26\plugins\java-decompiler\lib\java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true ApiVesrsionCondition.class .

    但是源文件也会存在问题:

    • 项目有使用lombok,反编译处理的Java 文件 hashCode 第一行都多了一句 “int PRIME = true;”
      在这里插入图片描述

    Java Decompiler(JD-GUI)

    直接通过官网下载windows版本的执行程序,直接运行
    fernflower idea内置的反编译工具
    默认情况下到出的java 源码会后行号信息,可以再设置中关闭。
    反编译处理的Java 文件是有泛型的,但 hashCode 第一行也都多了一句 “int PRIME = true;”

    反编问题

    首先就是大量的 JavaBean 的 hashCode 方法多了一句 “int PRIME = true;” 会导致编译报错,需要手动处理,应为项目使用了 lombok,可以通过idea的lombok插件处理,再有问题的JavaBean源文件中右键 Refactor -> Lombok -> Default @Data。
    在这里插入图片描述
    源代码中存在大量的强制类型转换:

    User user = (User) this.userMapper.selectById(question.getTeacherUserId()); // 多余的强制类型转换
    User user = this.userMapper.selectById(question.getTeacherUserId());
    
    • 1
    • 2

    通过idea 的代码分析功能全局处理:
    在这里插入图片描述

  • 相关阅读:
    zookeeper分布式锁demo
    Linux文件,目录权限管理
    Qt --- Day03
    分布式锁java程序怎么处理 zk与redis
    Java审计对比工具JaVers使用
    基于Springboot的代驾管理系统(有报告)。Javaee项目,springboot项目。
    JVM调优工具锦囊:JDK自带工具与Arthas线上分析工具对比
    [附源码]计算机毕业设计JAVA校园期刊网络投稿系统
    无线通信与编码_MATLAB实现Turbo码的仿真_含仿真代码_Dr.WuYufei
    下载bigemap建筑物轮廓在arcscene如何生成模型
  • 原文地址:https://blog.csdn.net/i_love_t/article/details/127443961