什么是反编译?
反编译是将 Java 字节码(.class 文件)转换回人类可读的 Java 源代码(.java 文件)的过程,由于 Java 是一种“编译到字节码”的语言,这个过程是可行的,但反编译出的代码不一定是 100% 与原始源代码完全相同,因为它会丢失一些信息(如变量名、注释、代码结构等)。

使用命令行工具
这是最经典和最灵活的方式,适合在服务器或自动化脚本中使用。
javap (JDK 自带)
javap 是 JDK 自带的“Java 反汇编器”(Java Disassembler),它不能生成完整的 .java 源代码,但可以查看类的方法、字段、字节码指令等,对于快速了解类的结构非常有用。
如何使用:
打开命令行,进入你的 .class 文件所在目录,然后执行:

# 基本用法,查看类的公共方法、字段和构造函数 javap YourClassName # 查看所有成员(包括私有的) javap -private YourClassName # 查看详细信息,包括常量池、字节码指令 javap -v YourClassName # 输出到文件 javap -v YourClassName > YourClassName.txt
优点:
- 无需安装,JDK 自带。
- 快速了解类的公共接口和基本结构。
缺点:
- 不能生成源代码,只能反汇编成字节码指令,可读性较差。
CFR (推荐)
CFR 是一个现代、强大且开源的反编译器,生成的代码质量非常高,是目前社区中最受欢迎的工具之一。
如何使用:

- 下载 CFR:访问 CFR 的 GitHub Releases 页面 下载最新的 JAR 文件。
- 执行命令:在命令行中,使用
java -jar来运行 CFR。
# 基本用法 java -cfr path/to/YourClassName.class # 将输出保存到 .java 文件 java -cfr path/to/YourClassName.class > YourClassName.java # 输出到指定目录 java -cfr path/to/YourClassName.class --outputdir path/to/output_dir # CFR 有很多有用的选项, # --caseinsensitive: 在处理混淆过的代码时很有用 # --obfuscationtypes: 指定混淆类型,帮助更好地反混淆 # --showversion: 显示 CFR 版本
优点:
- 代码质量高,生成的代码结构清晰,可读性好。
- 支持最新的 Java 版本特性。
- 活跃的开源项目,持续更新。
- 功能强大,支持反混淆。
缺点:
- 需要手动下载 JAR 文件。
Procyon (推荐)
Procyon 是另一个非常优秀的开源反编译器,由 JetBrains(IntelliJ IDEA 的开发者)前员工创建,它的代码生成质量也很高,尤其在处理 enum 和匿名类方面表现出色。
如何使用:
- 下载 Procyon:访问 Procyon 的 Maven Central 页面 下载最新的 JAR 文件。
- 执行命令:
# 基本用法 java -jar procyon-decompiler-0.5.36.jar path/to/YourClassName.class # 输出到文件 java -jar procyon-decompiler-0.5.36.jar path/to/YourClassName.class > YourClassName.java
优点:
- 代码质量高,对一些特殊 Java 语法支持很好。
- 开源项目。
缺点:
- 项目更新频率不如 CFR 高。
使用图形化界面工具
图形化工具提供了更直观、更便捷的操作方式,适合日常使用。
JD-GUI (经典之选)
JD-GUI 是一个非常流行且易于使用的 Java 反编译器,它提供了一个简单的窗口来浏览 .class 文件或整个 JAR/WAR 包。
如何使用:
- 下载 JD-GUI:访问 JD-GUI 的官方发布页面 下载对应你操作系统的版本。
- 打开并使用:
- 直接拖拽
.class文件或.jar文件到 JD-GUI 窗口中。 - 或者通过
File -> Open菜单选择文件。
- 直接拖拽
- 查看代码:左侧是包和类的树形结构,点击任意类,右侧就会立即显示反编译出的源代码。
优点:
- 非常简单易用,即开即用。
- 支持直接打开 JAR/WAR 包,方便查看整个项目。
- 速度快。
缺点:
- 界面相对老旧。
- 对于非常新或极度混淆的代码,反编译效果可能不如 CFR 或 Procyon。
IntelliJ IDEA (内置功能)
如果你正在使用 IntelliJ IDEA,它内置了强大的反编译功能,无需安装任何插件。
如何使用:
- 打开你的项目。
- 在项目结构中找到
.class文件(通常在target或build目录下)。 - 直接双击打开
.class文件。 - IDEA 会自动在一个只读的标签页中显示反编译后的源代码。
优点:
- 集成在强大的 IDE 中,无缝切换。
- 可以方便地查看依赖库中的
.class文件。 - 反编译引擎质量高。
缺点:
- 必须安装 IntelliJ IDEA(社区版免费)。
在线反编译工具
适用于快速、偶尔地反编译单个 .class 文件,不想安装任何软件的情况。
常用工具:
如何使用:
- 打开网站。
- 上传你的
.class文件。 - 网站会立即在浏览器中显示反编译后的代码,或者提供下载链接。
优点:
- 无需安装,使用方便。
- 适合快速检查。
缺点:
- 安全风险:不要上传包含敏感信息或商业机密的
.class文件。 - 通常有文件大小限制。
- 网络连接依赖。
总结与对比
| 工具名称 | 类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
javap |
命令行 | JDK自带,无需安装 | 不能生成源代码,可读性差 | 快速查看类结构、方法签名 |
| CFR | 命令行 | 代码质量高,功能强大,支持新特性 | 需手动下载 JAR | 首选,需要高质量源码、自动化脚本、服务器环境 |
| Procyon | 命令行 | 代码质量高,对特殊语法支持好 | 更新频率稍低 | 作为 CFR 的替代选择 |
| JD-GUI | 图形化 | 简单易用,支持拖拽 JAR | 界面老旧,处理复杂代码能力稍弱 | 日常快速浏览、查看 JAR 包内容 |
| IntelliJ IDEA | 图形化 | 集成度高,功能强大 | 需要安装 IDEA | IDEA 用户,无缝开发体验 |
| 在线工具 | 在线 | 无需安装,方便快捷 | 安全风险,大小限制,依赖网络 | 快速、临时的单文件反编译 |
推荐方案
- 日常开发/学习首选:JD-GUI,它简单、快速、直观,能满足大部分需求。
- 追求最高代码质量/自动化:CFR,它是目前公认的反编译效果最好的命令行工具。
- 如果你已经是 IntelliJ IDEA 用户:直接使用其内置功能,体验最佳。
对于绝大多数情况,你只需要在 JD-GUI 和 CFR 之间选择一个即可,JD-GUI 用于快速浏览,CFR 用于需要获取高质量代码或进行自动化处理的场景。
