4 ツール概要

Java の逆コンパイルツールは複数存在するが、現在実用的に使われているのは主に 4 種類だ。いずれも無料で使用できる。

CFR
CLI ツール。単一 JAR で動作し精度が高い。出力がクリーンで読みやすい。インストールが最も簡単。
Fernflower
IntelliJ IDEA に内蔵。単体でも CLI 実行可能。Gradle プラグインとしても使える。JetBrains 製。
Procyon
ラムダ式(invokedynamic)・内部クラスの復元精度が高い。Java 8〜11 の古いバイトコードに強い。
jadx
GUI ツール。JAR/AAR/APK を開いてブラウズ可能。Android 開発者に人気だが Java でも十分使える。

CFR — シンプルで高精度な CLI ツール

CFR(Class File Reader) は Lee Benfield 氏が開発した CLI ツールで、 GitHub からダウンロードできる。 単一の実行可能 JAR であり、java -jar cfr.jar で即実行できる点が最大の長所だ。

Shell — CFR インストール
# GitHub Releases から最新版を取得(例: 0.152)
# https://github.com/leibnitz27/cfr/releases

# macOS / Linux
curl -L -o cfr.jar https://github.com/leibnitz27/cfr/releases/download/0.152/cfr-0.152.jar

# Windows(PowerShell)
Invoke-WebRequest -Uri "https://github.com/leibnitz27/cfr/releases/download/0.152/cfr-0.152.jar" `
  -OutFile cfr.jar

# 動作確認
java -jar cfr.jar --version

主なオプション:

オプション説明
--outputdir <dir>出力ディレクトリを指定
--comments falseコメントを省略してコードをすっきりさせる
--lambdatoinnercls falseラムダを内部クラスに変換しない(デフォルト形式を維持)
--showversion falseバージョン情報コメントを非表示
--caseinsensitivefs true大文字小文字を区別しないファイルシステム向け

💡 CFR の強み

出力コードが整形されており、そのままコンパイルできるケースが多い。Java 17 以降の record / sealed class にも対応済み。最も活発にメンテナンスされているツールの一つ。

Fernflower — IntelliJ 内蔵の定番

Fernflower は JetBrains が開発した分析的逆コンパイラで、IntelliJ IDEA に標準搭載されている。 .class を IDE で開くと自動的に逆コンパイルされて表示される。 単体 CLI 版は intellij-community リポジトリ にある。

Shell — Fernflower CLI 実行
# IntelliJ インストール済みであれば fernflower.jar は以下に存在する
# Windows: C:\Program Files\JetBrains\IntelliJ IDEA <version>\plugins\java-decompiler\lib\java-decompiler.jar
# macOS:   /Applications/IntelliJ IDEA.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar

# CLI で実行する
java -jar java-decompiler.jar Target.class ./output/

# JAR 全体を対象にする場合
java -jar java-decompiler.jar myapp.jar ./output/

Procyon — ラムダ・内部クラスに強い

Procyon は Mike Strobel 氏が開発した逆コンパイラで、 ラムダ式(invokedynamic)内部クラスの復元精度が他ツールより優れている。 特に Java 8 のストリーム処理を含むコードを読む場面で役立つ。

Shell — Procyon 実行
# Maven Central から取得
# https://search.maven.org/artifact/org.bitbucket.mstrobel/procyon-decompiler

# 実行(単一ファイル)
java -jar procyon-decompiler-0.6.0.jar Target.class

# 出力ディレクトリ指定
java -jar procyon-decompiler-0.6.0.jar -o ./output Target.class

# JAR 全体
java -jar procyon-decompiler-0.6.0.jar -o ./output myapp.jar

jadx — GUI つきで最も使いやすい

jadxskylot 氏が開発したツールで、 GUI(jadx-gui)と CLI(jadx)の両方が提供されている。 ファイルを開くとクラスツリーをブラウズしながらソースを確認できるため、探索的な解析に向いている。

Shell — jadx インストール・実行
# GitHub Releases から zip を取得
# https://github.com/skylot/jadx/releases

# 解凍後 bin/ に jadx, jadx-gui が入っている

# GUI 起動(JAR / WAR / APK をドラッグ&ドロップ)
./bin/jadx-gui

# CLI で一括エクスポート
./bin/jadx -d ./output myapp.jar

# WAR を直接処理
./bin/jadx -d ./output myapp.war

# 詳細オプション
./bin/jadx --help

jadx の強み

GUI でクラスツリーを眺めながら特定のクラスだけ逆コンパイルできる。検索機能も充実しており、「どのクラスを見ればいいか分からない」段階の探索に最適。Android の APK も扱えるため汎用性が高い。

比較表まとめ

ツール 精度 速度 GUI ラムダ対応 最新Java 一言
CFR 速い なし 良好 Java 21+ 迷ったらこれ。CLI のみだが出力がクリーン
Fernflower 普通 IntelliJ 内蔵 良好 最新対応 IDE で確認するなら最も手軽
Procyon 普通 なし 最も強い Java 11止まり気味 Java 8 ラムダの可読性が最も高い
jadx 中〜高 普通 あり 良好 Java 21+ 探索的解析・GUI 操作が必要な場面向き

選定フローチャート

テキストフローチャート — ツール選定
逆コンパイルしたい
│
├─ IDE(IntelliJ)で .class を開いて読むだけでよい?
│     YES → Fernflower(IDE 内蔵で自動)
│
├─ GUI でクラスツリーを眺めながら探索したい?
│     YES → jadx-gui
│
├─ ラムダ式・ストリームが多い Java 8 コード?
│     YES → Procyon(可読性が最も高い)
│
└─ CLIで大量ファイルを一括処理・スクリプト化したい?
      YES → CFR(シンプル・高精度・メンテ活発)

どれか迷ったら → まず CFR を試す

次の PART では…

PART 03 では CFR を使って .class ファイル単体を逆コンパイルする基本手順を、コマンドと出力結果を交えて詳しく解説する。

→ PART 03 — .class 単体の逆コンパイルへ