登录
首页 >  文章 >  java教程

Java反编译插件使用教程

时间:2026-04-23 23:03:35 295浏览 收藏

本文详解了在 IntelliJ IDEA 中高效配置与使用 CFR 反编译插件的最佳实践,涵盖为何 CFR 是目前兼容 Java 17+(包括 sealed class、record 等新特性)、稳定性远超 Jad 和 Procyon 的首选方案,以及应对“Decompiled code not available”、var 类型丢失、空方法体等高频问题的精准排查路径——从禁用冲突内置解码器、正确配置 module-info 和 JDK 类反编译选项,到修正 Maven 编译参数保留调试信息,再到识别字节码不支持场景并切换至 javap 或源码定位等务实替代策略,为开发者提供了一套开箱即用、深入底层又切实可行的.class 文件逆向分析指南。

配置IDE的Java反编译插件_直接查看.class字节码的源码逻辑

IntelliJ IDEA 里装哪个反编译插件最稳

CFR,别选 Jad 或默认的 Procyon(新版 IDEA 自带那个)。Jad 已停更多年,遇到 Java 8+ 的 lambda、try-with-resources、模块化语法直接崩;Procyon 对泛型擦除后重载方法识别不准,常把 list.get(0) 反成 list.get((Integer)0) 这种错类型调用。CFR 更新勤、兼容性好,Java 17 的 sealed class 和 record 都能稳住。

安装路径:Settings → Plugins → 搜 CFR Decompiler → 点 Install。装完不用重启,但得关掉自带的 Java Bytecode Decompiler(在同一个插件页里禁用它),否则俩插件抢着干活,结果随机出错。

点开 .class 文件却显示“Decompiled code is not available”

这是 IDEA 没把该类识别为可反编译目标,常见于三种情况:

  • 项目用了 module-info.class —— CFR 默认不处理模块描述符,删掉或手动跳过它
  • 类被混淆(比如 a.b.c.d 这种包名 + 单字母类名)—— CFR 能反,但变量名全丢,得配合 mapping.txt 手动对齐
  • 类来自 rt.jar 或 JDK 内置模块(如 java.base)—— IDEA 默认走源码挂载逻辑,得进 Settings → Languages & Frameworks → Java → Class Decompile 设置里,勾上 Decompile library classes

反出来的代码里 var 全没了,全是 ObjectObject[]

这不是插件问题,是编译时没保留局部变量表(-g:vars)。CFR 依赖 class 文件里的 LocalVariableTable 属性还原类型,而很多构建工具(尤其 Maven 的 maven-compiler-plugin 低版本)默认只打 -g:lines,source

检查你的 pom.xml

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.11.0</version>
  <configuration>
    <debug>true</debug>
    <debuglevel>source,lines,vars</debuglevel>
  </configuration>
</plugin>

改完重编译一次,再点开 .class 就能看到真实类型了。

为什么有时候反编译出来的方法体是空的,只有一行 throw new UnsupportedOperationException();

这是 CFR 遇到它解析不了的字节码模式(比如某些 Kotlin 内联函数生成的异常块、GraalVM native image 的 stub 类),不是你配置错了。它会 fallback 到这个兜底逻辑,避免抛异常卡死 IDE。

此时可以:

  • 右键该类 → Open Library Source(如果有源码 jar 挂载)
  • 用命令行手动跑 cfr.sh YourClass.class --outputdir ./out,看终端输出有没有 warning,比如 Unsupported opcode: INVOKEDYNAMIC
  • 换用 javap -c YourClass.class 看原始字节码指令,确认是不是用了 JVM 15+ 的新特性(CFR 1.0.16 支持到 19,但某些 preview 特性仍不支持)

真遇到这种 case,别硬刚反编译,直接查对应开源项目的 release tag 或 git commit,比猜字节码靠谱。

最麻烦的是混合了 Kotlin + Java + GraalVM 的项目,反编译只是辅助,关键逻辑还得看 build 产物里的 actual jar 包和对应的 build log。

理论要掌握,实操不能落!以上关于《Java反编译插件使用教程》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>