何谓反编译
将编译后的 .class 字节码文件还原成可读的Java源代码的过程
编译之后文件内容

相关反编译工具和技术
| 工具/方法 | 核心特点 | 适用场景 |
|---|---|---|
| IntelliJ IDEA | 内置反编译器 开发工具无缝集成,开箱即用,操作最简便。 | 日常开发中快速查看第三方库的类源码,或进行调试。 |
| JD-GUI | 经典的独立图形化工具,跨平台(Win/Mac/Linux),支持拖拽,操作简单直观。 | 快速查看单个Jar包或Class文件,尤其是当你想把反编译结果保存下来时。 |
| CFR / Procyon / Fernflower (命令行) | 功能强大,支持较新的Java特性(如Lambda、泛型),反编译成功率和代码准确性高。 | 需要批量处理大量文件、处理高版本Java编译的类,或在服务器等无图形界面环境下使用。 |
相关反编译工具演示
idea
IntelliJ IDEA:它内置了 Fernflower 反编译器

JD-GUI
https://java-decompiler.github.io/
安装好之后,直接将jar拖入个类文件拖到JD-GUI中,即可看到反编译结果

fernflower 命令方式
Fernflower 是一款由 JetBrains 官方推荐的 Java 反编译器
- 下载 下载
http://the.bytecode.club/fernflower.jar
- 源码
https://github.com/JetBrains/fernflower
命令操作
java -jar fernflower.jar D:\maven\repo\ai\djl\huggingface\tokenizers\0.32.0\tokenizers-0.32.0.jar ./decompiled_src/

如何防止
代码混淆
- proguard 下载
https://github.com/Guardsquare/proguard?tab=readme-ov-file#-quick-start
- java源码
package com.jysemel.java.basic;
public class UserService {
private String userName;
private int userAge;
public UserService(String name, int age) {
this.userName = name;
this.userAge = age;
}
public void printUserInfo() {
System.out.println("User Name: " + userName);
System.out.println("User Age: " + userAge);
}
private int calculateBirthYear(int currentYear) {
return currentYear - userAge;
}
public void printBirthYear(int currentYear) {
int birthYear = calculateBirthYear(currentYear);
System.out.println("Birth Year: " + birthYear);
}
public static void main(String[] args) {
UserService user = new UserService("Alice", 30);
user.printUserInfo();
user.printBirthYear(2025);
}
}
- proguard 配置文件 (@config.pro)
# 指定输入/输出
-injars UserService.class
-outjars UserService_obfuscated.jar
# 指定当前运行环境(Java运行时库)
-libraryjars <java.home>/jmods/java.base.jmod(!**/*.class;!module-info.class)
# 保留入口点 main 方法(否则程序无法运行)
-keep public class UserService {
public static void main(java.lang.String[]);
}
# 默认的混淆设置(重命名类、方法、字段)
-dontshrink # 不压缩(可选,便于观察)
-dontoptimize # 不优化(可选,便于观察)
-useuniqueclassmembernames # 混淆后的方法名尽量唯一
-adaptclassstrings # 适应字符串中的类名
- 执行混淆命令
java -jar /path/to/proguard.jar @config.pro
字节码加密 (Class Encryption)
本地代码(JNI/JVMTI)与硬件绑定
总结
没有绝对的安全,只有不断增加的破解成本
