java代码反编译CFR

java代码反编译CFR

1.下载文件

从 CFR 的官方网站下载最新的 .jar 文件

官方下载:https://www.benf.org/other/cfr

直接链接(以 0.152 版本为例):https://www.benf.org/other/cfr/cfr-0.152.jar

2.开始使用

2.1 下载完成后,进行验证安装

执行:

bash 复制代码
java -jar cfr-0.152.jar --version

注意:如果在构建时遇到 maven-compiler-plugin 错误,请确保你的 JAVA_HOME 环境变量指向 JDK 8 或 11。

2.2 之后,就可以直接通过 java -jar 命令来运行它了

bash 复制代码
java -jar cfr-0.152.jar [选项] <要反编译的文件>

3.基础用法

CFR 的核心使用命令格式为:java -jar cfr.jar [选项] <目标文件>

3.1 反编译单个 .class 文件

直接指定 .class 文件的路径,结果会输出到控制台。

bash 复制代码
java -jar cfr-0.152.jar com/example/MyClass.class[reference:19][reference:20]

3.2 反编译整个 .jar 文件

指定 .jar 文件路径,并使用 --outputdir 指定输出目录,将源码保存到文件中

bash 复制代码
java -jar cfr-0.152.jar your-library.jar --outputdir ./decompiled-src[reference:23]

3.3 批量反编译

CFR 支持递归处理目录。如果目标是一个目录,它会自动寻找并反编译其中所有的 .class 和 .jar 文件

bash 复制代码
java -jar cfr-0.152.jar ./thr/* --outputdir ./out_thr

3.4 常用配置选项

你可以通过添加参数来定制反编译行为,使用 --help 可以查看所有选项

选项 说明 示例

--outputdir <目录> (重要) 指定所有反编译源码的输出目录。 --outputdir ./src

--outputpath <文件> 指定单个文件的输出路径,用于反编译单个类。 --outputpath MyClass.java

--decodelambdas 尝试将字节码还原为 Lambda 表达式,提高可读性。 --decodelambdas true

--silent 减少控制台输出的日志信息。 --silent true

--comments 在生成的代码中尽可能保留原始注释。 --comments true

--renameillegalidents 重命名混淆后产生的非法标识符,使代码更符合 Java 规范。 --renameillegalidents true

--enableclassfilter (高级) 启用后,会跳过 Spring、Guava 等常见第三方库,显著加快大型 Jar 包的反编译速度。 --enableclassfilter

--help 显示所有可用的命令行选项。 --help

提示:你也可以将这些配置写入一个文件(如 cfr.config),然后通过 --config 参数加载

4.注意事项

代码完整性:反编译得到的代码主要用于阅读和学习,逻辑与原代码高度一致,但不可能完美还原原始的变量名、注释等信息,不能直接用于编译。

代码混淆:如果 Jar 包经过代码混淆(如 ProGuard),反编译后的代码可读性会极差。

法律合规:反编译他人代码前,请确保遵守相关软件的许可协议和法律,仅用于学习、调试或获得明确授权的场景。

相关推荐
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里1 天前
java中的继承和多态的区别
java
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕1 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码1 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖1 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时1 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang1 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++