Javaではプログラムを動かすためにclassファイルを生成するため、アプリケーションとして配布されている中にJavaファイルが存在せずソースコードを確認出来ないことも少なくありません。
本記事では、classファイルからJavaコードを確認するデコンパイルの方法についてご紹介していきます。
目次
デコンパイルとは
Javaのようなコンパイル言語と呼ばれるプログラミング言語では、コンパイルと呼ばれる作業により人間が読めるように記述したソースコードをコンピューターが読めるコードにあらかじめ変換しておく方法が採用されています。
このコンパイルしたコードを、再度人間が読めるソースコードに戻す作業をデコンパイルと呼びます。
デコンパイラ
デコンパイルを行うためには、デコンパイラと呼ばれるツールを利用します。
デコンパイラは複数の種類が提供されているので、ご自身の開発環境で利用しやすいツールを選びましょう。
逆アセンブルとの違い
機械語から人間が理解するための言語に変換する似た機能に「逆アセンブル」と呼ばれる処理があります。
逆アセンブルとデコンパイルの違いは、機械語から変換される言語がアセンブリ言語かJavaのような高級言語かによって分かれています。
アセンブリ言語以外の場合にはデコンパイルと呼ばれることが多く、アセンブリ言語に変換する場合は逆アセンブルと区別されることが多いようです。
Javaのデコンパイラをインストールしてみよう
では今回は「JD-Eclipse」を利用してJavaのデコンパイルを試してみたいと思います。
まずはダウンロードページにアクセスし、ソフトウェアをダウンロードしておきましょう。
ダウンロード方法
Java Decompilerのトップページを開くとJD-Eclipseの項目に「Download」のリンクが見えるのでクリックします。
zipファイルのダウンロードリンクが表示されるので、クリックします。
インストール作業
ダウンロードが完了しましたら、Eclipseを起動してメニューバーの「ヘルプ」から「新規ソフトウェアのインストール」を選択します。
インストール用のポップアップ画面が開くので、作業対象の追加ボタンをクリックします。
「アーカイブ」ボタンからダウンロードしたzipファイルを選択し、「追加」ボタンをクリックします。
表示される「Java逆コンパイラー Eclipseプラグイン」にチェックをいれ、「次へ」ボタンをクリックします。
インストール項目が表示されるので確認して「次へ」ボタンをクリックします。
ライセンスの確認画面になりますので「使用条件の条項に同意します」を選択して「完了」ボタンをクリックします。
再起動を促されるので、Eclipseを再起動するとインストールが完了です。
デコンパイラを使ってJavaのクラスファイルをデコンパイルしてみよう
では実際にインストールしたJD-Eclipseでデコンパイルを試してみましょう。
サンプルコード
まずはクラスファイルを作成するための簡単なJavaプログラムコードを作成しておきます。
Main.java
package sample; public class Main { public static void main(String[] args) { String name = "ポテパン"; int number = 100; System.out.println("name: " + name); System.out.println("number: " + number); } }
クラスファイルの作成
サンプルコードが作成できたらコンパイルを実行してクラスファイルを作成します。
作成したソースコード(Main.java)のあるフォルダで下記のコマンドを実行します。
javac Main.java
デコンパイル
ではクラスファイルが作成出来たのでEclipse上で「プロジェクトエクスプローラー」を開きます。
作成したクラスファイルを右クリックして「次で開く」から「クラス逆コンパイラー・ビューアー」を選択します。
表示されたコードはクラスファイルからデコンパイルされたものとなっています。
/* */ package sample; /* */ /* */ /* */ public class Main { /* */ public static void main(String[] var0) { /* 6 */ String var1 = "ポテパン"; /* 7 */ Object var2 = true; /* */ /* 9 */ System.out.println(var1); /* 10 */ System.out.println((String)var2); /* 11 */ } /* */ }
元のコードと比較すると若干異なりますが、大まかには一致していることが確認出来ます。
jarファイルからデコンパイル
Javaのシステムは多くのクラスファイルから構成されるため、jar形式にまとめられて配布されていることも多いので、jar形式のデコンパイル方法も確認しておきましょう。
jarファイルを展開
jarファイルは複数のclassファイルを圧縮しているだけなので、ダブルクリックやEclipse上では矢印アイコンをクリックするだけでclassファイル単位に展開することが可能です。
参照ライブラリに格納されたjarファイルを順に展開していくと、画像のように複数のクラスファイルが表示されます。
classファイルをデコンパイル
クラスファイルまで展開出来たらあとは同様に、クラスファイルを右クリックして「次でクラスを開く」から「JD-Core」を選択します。
表示されたコードが下記です。
/* */ package com.mysql.jdbc; /* */ /* */ import java.io.PrintStream; /* */ import java.sql.SQLException; /* */ /* */ public class Driver /* */ extends com.mysql.cj.jdbc.Driver /* */ { /* */ public Driver() /* */ throws SQLException /* */ {} /* */ /* */ static /* */ { /* 43 */ System.err.println("Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary."); /* */ } /* */ }
元のコードが分からないので100%正確だとは言えませんが、プログラマーが読み取れるJavaのコードとして表示されていることが分かります
さいごに: Javaシステムをデコンパイルしてプログラミング学習に役立てよう
本記事では、Javaのデコンパイルについて実際のツールを使いながらご紹介してきました。
プログラミング学習にもこのデコンパイル機能は非常に有用で、jarファイルやクラスファイルしか提供されていないシステムでもある程度の解析が可能となります。
jarファイルやクラスファイルしか提供されていないシステムでも、一度デコンパイルでのソース解析を試してプログラミング学習に役立ててみてください。