Jarファイルはzipで圧縮がされています。この解凍すると、多くの .class
ファイルがあります。
classファイルは、Javaファイルをバイトコードにコンパイルし、生成された成果物です。
classファイルを開くと、Javaコードが見えないので、見たい場合はJavaで再びコンパイルする必要があります。
decompileする方法はいろいろありますが、ここでは次の二つの方法を紹介します。
- IntelliJ IDEでコンパイルする方法
- jd-cliツールを利用して逆コンパイルする方法
1. IntelliJ IDEでデコンパイルする方法
.class
ファイルをJavaファイルにコンパイルするための最も簡単な方法の一つは、IntelliJを利用する方法です。
IntelliJを使用している場合、 .class
ファイルをDrag-and-dropして、IDEのウィンドウに上げておくだけで、自動的にJavaでコンパイルされます。
2. jd-cliツールを使用してデコンパイルする方法
classファイルをJavaでdecompileする jd-cli
というツールがあります。 Jarファイル内のすべてのclassファイルをJavaに変換してくれるので便利です。
jd-cliツールは、GitHub - Jd-cmdからダウンロードすることができます。
私は、インストールファイルを ~/apps/jd-cli-0.9.2-dist/
パスに解凍し保存しました。
その後、次のようにjd-cli.jarコマンドを実行することができます。コマンドの引数としてコンパイルしたいjarファイルと変換されたファイルが保存されている場所を入力します。
$ java -jar jd-cli.jar [jar file] -od [output folder]
私の場合は、次のようなコマンドでコンパイルすることができます。 output
フォルダを見ればjavaファイルにコンパイルされたことを確認することができます。
java -jar ~/apps/jd-cli-0.9.2-dist/jd-cli.jar android.jar -od output
$ jd-cli android.jar -od output
09:13:41.923 INFO jd.cli.Main - Decompiling android.jar
09:13:41.925 INFO jd.core.output.DirOutput - Directory output will be initialized for path output
09:13:46.225 INFO jd.core.output.DirOutput - Finished with 4751 class file(s) and 7594 resource file(s) written.
classファイル1個のみデコンパイル
jd-cliはjarだけでなく、classファイルをJavaに変換するコマンドもあります。
- java -jar jd-cli.jar [class file]:classファイルをjavaに変換して、画面に出力します
- java -jar jd-cli.jar [class file] -od [output folder]:classファイルをjavaに変換してouput folderに保存されます
次のように使用することができます。
$ java -jar jd-cli.jar AbstractCollection.class
09:32:37.885 INFO jd.cli.Main - Decompiling /home/js/Desktop/android/java/util/AbstractCollection.class
package java.util;
import androidx.annotation.RecentlyNonNull;
import androidx.annotation.RecentlyNullable;
public abstract class AbstractCollection<E>
....
alias (For linux user)
毎回コマンドを入力すると、面倒ため ~/.bashrc
に以下のようにコマンドをaliasで登録することができます。
$ alias jd-cli='java -jar ~/apps/jd-cli-0.9.2-dist/jd-cli.jar'
aliasを登録すると、次のように短いコマンドでコンパイルすることができます。
$ jd-cli android.jar -od output
Related Posts
- Java - AtomicReference使用方法
- Java - CountDownLatchを使用する方法、および例
- Java - ScheduledThreadPoolExecutor使用方法
- Java - SummaryStatisticsの使用方法(count、min、max、average)
- Java8 - 関数型インタフェース (Functional Interface) について
- Java - String配列をint配列に変換する
- Java - ArrayList要素の値を変更する方法、replaceAll()
- Java - 2つのリストが同じかどうかを比較
- Java - 配列から特定のIndex要素を削除する3つの方法
- Java - HashMapソート、4つの方法
- Java - 文字列を配列に変換する方法
- Java - ArrayListが空であることを確認する3つの方法
- Java - ArrayListの巡回、4つの方法
- Java - ArrayListの最大値、最小 値を見つける
- Java - ArrayListの合計、平均値の計算
- Java - HashMap巡回、3つの方法
- Java - do whileとwhileの違い
- Java - Lambda式と関数型インタフェース
- Java - List empty(null)チェック、3つの方法
- Java - ArrayListの初期化、4つの方法
- Java - Stream.reduce()の使い方と例
- Java - 2つのマップを結合する(merge、putAll)
- Java - java.util.Dateをjava.sql.Dateに変換する
- Java - ArrayListをStringに変換する
- Java - ClassNotFoundExceptionの発生原因と解決策
- Java - 非静的メソッドは静的コンテキストから参照できません
- Java - NoSuchMethodErrorの原因と解決策
- Java - JSONライブラリを使用する方法(JSONObject、JSONArray)
- Java - byte[]配列をFileに保存
- Java - byte[]の配列をStringに変換
- Java - ファイルのアクセス権を確認し、変更
- Java - 一時フォルダ(Temp directory)パスを取得する
- Javaでシェルスクリプトを実行
- Java - Streamを配列に変換する
- Java - リスト重複排除、2つの方法