Java 編譯器 (javac) 將 .java 編譯為含**位元組碼**的 .class 檔案。位元組碼為 JVM 指令集,非機器碼,理論上可逆向還原高層語言結構。
javap -c -private HelloWorld
# 輸出位元組碼助記符,非 Java 原始碼
# 例:
# public void paint(java.awt.Graphics);
# Code:
# 0: aload_1
# 1: ldc #1
# 3: bipush 20
# ...
javap 僅能顯示方法簽名、位元組碼、常數池,**無法還原變數名、註解、控制流結構**(如 for/while 變為 goto)。
java mocha.Decompiler [-v] [-o] HelloWorld.class → 產生 HelloWorld.mocha(Java 源碼)。| 工具 | 特色 | 適用場景 |
|---|---|---|
| JD-GUI | 圖形化、跨平台、支援 Java 8+、可導出專案 | 快速查看、分析第三方 JAR |
| CFR | 命令列、高還原度、支援最新 Java 版本、活躍維護 | 自動化批量反編譯、CI 集成 |
| Fernflower | IntelliJ IDEA 內建、極強結構還原、支援 Kotlin | IDE 一鍵查看、專案級反編譯 |
| Procyon | 專注 Java 8+ 新特性(Lambda、Stream、預設方法) | 現代代碼庫分析 |