HOWTO · Java
Java クラスを逆コンパイルする
Eclipse、IntelliJ IDEA、コマンドライン デコンパイラ、JD-GUI を使って Java の .class ファイルや JAR を調査する方法を学びます。
このページの内容
コンパイル済みの Java コードを調べるには、スタンドアロンの .class ファイルを IDE やデコンパイラで開くか、アーカイブに対応したツールで .jar アーカイブを参照します。Enhanced Class Decompiler(ECD)を備えた Eclipse IDE と IntelliJ IDEA は再構築されたソースを表示できます。JD-CLI と FernFlower はコマンドラインのワークフローを提供し、JD-GUI は参照しやすいインターフェースを提供します。逆コンパイルはソースが利用できない場合に動作を理解する助けになりますが、元のソースを正確に復元することはできません。コメントや書式はバイトコードに含まれず、名前や構造が異なる場合があります。
逆コンパイルは、Java チュートリアル のクラスとメソッドのグループにある、クラスレベルのトピックの一つです。
Java クラスを逆コンパイルする理由
コンパイルされた .class ファイルには、クラスの Java バイトコードが含まれています。.jar ファイルは、クラスファイル、画像、設定、その他のリソースを含むことができるアーカイブです。アーカイブは ZIP ツールで一覧表示や展開ができます。逆コンパイルは、その中のコンパイル済みクラスの読みやすいコードが必要な場合に役立ちます。
開発者は通常、ライブラリを理解したり、動作を調査したり、何がパッケージされたかを確認したりするためにコンパイル済みクラスを調べます。すでに IDE で作業している場合は IDE を、ファイル処理を繰り返し行う必要がある場合はコマンドライン デコンパイラを、クラスを対話的に参照したい場合は JD-GUI を選んでください。一般に、ファイルへのアクセスと、その形式を読み取れるツールが必要です。ファイルが JAR であること自体は、そのファイルの権限が制限されていることを意味しません。
Java デコンパイラ
Java デコンパイラはバイトコードを解析し、ソースに似た Java コードを再構築します。その結果は近似であり、ソースプロジェクトの復元ではありません。コンパイラは通常、コメントとソースの書式を除去します。コンパイラのオプションや利用可能なデバッグ メタデータによっては、ローカル変数名や行情報も欠けることがあります。JAR はファイルのアーカイブであり、.class ファイルは個別のコンパイル済みクラスです。デコンパイラはツールによってどちらも受け付ける場合があります。
手早く調べるには IntelliJ IDEA または Eclipse IDE を使用します。ターミナルのワークフローには JD-CLI または FernFlower を使用します。JAR を参照してウィンドウでクラスを選択するには JD-GUI を使用します。Java デコンパイラの概要には、関連するツールの情報があります。
Eclipse IDE を使用して Java クラスを逆コンパイルする
Eclipse Marketplace から Enhanced Class Decompiler(ECD)プラグインをインストールし、クラスファイルをそのエディタに関連付けます。
- Help を開き、Eclipse Marketplace を選択します。Enhanced Class Decompiler を検索し、インストールの指示に従います。
- Window > Preferences を開き、General > Editors > File Associations を選択します。
*.classファイルタイプを選択します。関連付けられたエディタの一覧で ECD デコンパイラ エディタを選択し、クラスファイルをそこで開きたい場合はデフォルトとして設定します。- 設定を適用し、Project Explorer または Package Explorer で
.classファイルを開きます。
メニューのラベルは Eclipse のリリースによって若干異なる場合があります。ファイルが別のエディタで開く場合は、File Associations に戻り、*.class ファイルに対してデコンパイラ エディタが選択されていることを確認してください。
IntelliJ IDEA を使用して Java クラスを逆コンパイルする
IntelliJ IDEA は、ライブラリ内のクラスを含め、解決できるクラスファイルについて逆コンパイルされたソースを表示できます。Project ビューからクラスを開くか、名前でクラスに移動します。IDE は再構築されたソースビューを表示します。これは、別途デコンパイラを用意しなくても調査できる点で便利です。表示されるコードはあくまでバイトコードから導出されたものであり、元のソースファイルではありません。
コマンドラインを使用して Java クラスを逆コンパイルする
コマンドライン デコンパイラは、既知の入力ファイルやアーカイブを処理したい場合に便利です。互換性のある Java ランタイムをインストールし、プロジェクトからツールを取得してください。そのリリースに同梱されている使用方法を確認してください。コマンドの構文、オプション、受け付ける入力形式はビルドによって異なる場合があります。ここにはツール固有のコマンドは含まれていません。対象のリリースについて検証済みの呼び出し方がないためです。
JD-CLI を使用する
JD-CLI はコマンドラインの Java デコンパイラです。実行ファイルと入力のパスを指定し、ダウンロードしたリリースで文書化されている出力オプションを使用します。そのリリースのヘルプやドキュメントで、スタンドアロンのクラス、JAR、またはその両方を受け付けるかどうか、再構築されたソースがどこに書き込まれるかを確認してください。JD-CLI は intoolswetrust/jd-cli からダウンロードし、そのビルドの使用ドキュメントに従ってください。
FernFlower を使用する
FernFlower も Java デコンパイラです。お使いのビルドで文書化されている構文で、デコンパイラ、ソースクラスまたはアーカイブ、出力先ディレクトリを指定します。そのバージョンが JAR だけでなくスタンドアロンのクラスも受け付けるかどうか、追加の設定が必要かどうかを確認してください。同様に、検証済みの FernFlower の呼び出し方はここには含まれていません。
FernFlower ミラーにはプロジェクトとビルドの情報があります。ソースのチェックアウトは、ビルドに互換性のある Gradle のセットアップを必要とする場合があります。通常の調査では、プロジェクトがパッケージ版を提供している場合はそちらを使用してください。ビルドとデコンパイラのコマンドは、選択したリリースとローカルの Java/Gradle インストールに依存するため、ここでは検証済みの実行手順としては示しません。
JD-GUI を使用して Java クラスを逆コンパイルする
JD-GUI は、クラスファイルを開いたり、JAR アーカイブ内のクラスを参照したりするためのグラフィカルな Java デコンパイラです。JD-GUI プロジェクトサイトから互換性のあるリリースをダウンロードしてください。アプリケーションのファイル選択ダイアログで .class ファイルまたは JAR を開き、ナビゲーションペインでクラスを選択して、再構築されたソースを調べます。正確なメニューはリリースによって異なります。
この完全な Java プログラムは挨拶を出力するもので、JD-GUI でそのクラスファイルを開く前にコンパイルするのに適しています。
public class Example1 {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
その標準出力は次のとおりです。
Hello World
コンパイルされたクラスを調べると、JD-GUI は args パラメータを paramArrayOfString のような別の名前で表示し、ソースコメントを省略する場合があります。コメントと書式は通常のクラス バイトコードには保存されません。デバッグ メタデータが存在する場合は、一部の名前や行情報が保持されることがあります。コンパイル時にデバッガを使用すること自体がクラスを読みやすくするわけではありません。再構築されたコードは動作を理解するための手引きとして扱い、正確なコメント、名前、プロジェクト構造が重要な場合は元のソースを参照してください。