项目缺失源码(外包项目没拿到源码 -_- ),但服务器上有项目的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文件
如果项目pom.xml中存在共有Maven仓库不存在的依赖时,我们可以再 wat 包中 WEB-INF/lib 目录下找到对应的jar 文件,然后发布到我们的私有Maven仓库就可以解决了。
参考 fernflower idea内置的反编译工具 对class 文件进行反编译,
结果发现泛型丢失,如下图:

我直接用idea(2020.2)打开class文件可以看到是有泛型的:

可能和fernflower版本有问题,参考使用idea自带的反编译工具 [FernFlower]Java 原文件时有泛型的。
java -cp 参数1 org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true 参数2 参数3
参数说明:
但是源文件也会存在问题:

直接通过官网下载windows版本的执行程序,直接运行

默认情况下到出的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());
通过idea 的代码分析功能全局处理:
