Java classファイルをjavapで逆アセンブルする

Javaのclassファイルをjavapで逆アセンブルするサンプルです。

確認環境
・Java 8

目次

サンプル javapとは
  確認するjavaのコード
  javapコマンドでクラスファイルを逆アセンブルする
  javapのヘルプ

javapとは

jdkのbinフォルダ配下にあるexeファイルです。
コマンドラインから実行するとJavaのクラスファイルを逆アセンブルできます。
以下は、OracleのJVMの仕様のリンクです。
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html

クラスファイルは、テキストエディタで開くと文字化けしていて読めません。

javaのコード

以下のコードをコンパイルして生成されたクラスファイルをjavapで確認します。

package test1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {

    	List<String> c = new ArrayList<>(Arrays.asList("赤","黄","青"));
    	c.add("オレンジ");
        System.out.println(c); //[赤, 黄, 青, オレンジ]
 	}
}

9行目は、ArrayListでリストを作成しています。初期値は3つあります。
10行目は、要素を1つ追加しています。
11行目は、リストの内容を表示しています。

javapコマンドでクラスファイルを逆アセンブルする

javapコマンドでクラスファイルを逆アセンブルします。
オプションに-c(逆アセンブル)を指定します。

D:\Test1>javap -c test1.class
Compiled from "Test1.java"
public class test1.Test1 {
  public test1.Test1();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #16                 // class java/util/ArrayList
       3: dup
       4: iconst_3
       5: anewarray     #18                 // class java/lang/String
       8: dup
       9: iconst_0
      10: ldc           #20                 // String 赤
      12: aastore
      13: dup
      14: iconst_1
      15: ldc           #22                 // String 黄
      17: aastore
      18: dup
      19: iconst_2
      20: ldc           #24                 // String 青
      22: aastore
      23: invokestatic  #26                 // Method java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;
      26: invokespecial #32                 // Method java/util/ArrayList."<init>":(Ljava/util/Collection;)V
      29: astore_1
      30: aload_1
      31: ldc           #35                 // String オレンジ
      33: invokeinterface #37,  2           // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
      38: pop
      39: getstatic     #43                 // Field java/lang/System.out:Ljava/io/PrintStream;
      42: aload_1
      43: invokevirtual #49                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      46: return
}

D:\Test1>

1行目は、javap -cでコマンドを実行しています。
7行目以降のコメントは自動で出力されています。

リダイレクトを使用すればファイルに出力できます。

javap -c test1.class  > text1.txt

javapのヘルプ

javapのヘルプです。javap -helpと入力します。

D:\Test1>javap -help
使用方法: javap 
使用可能なオプションには次のものがあります:
  -help  --help  -?        この使用方法のメッセージを出力する
  -version                 バージョン情報
  -v  -verbose             追加情報を出力する
  -l                       行番号とローカル変数表を出力する
  -public                  publicクラスおよびメンバーのみを表示する
  -protected               protected/publicクラスおよびメンバーのみを表示する
  -package                 package/protected/publicクラスおよび
                           メンバーのみを表示する(デフォルト)
  -p  -private             すべてのクラスとメンバーを表示する
  -c                       コードを逆アセンブルする
  -s                       内部タイプ署名を出力する
  -sysinfo                 処理しているクラスのシステム情報(パス、サイズ、日付、MD5ハッシュ)
                           を表示する
  -constants               final定数を表示する
  -classpath         ユーザー・クラス・ファイルを検索する場所を指定する
  -cp                ユーザー・クラス・ファイルを検索する場所を指定する
  -bootclasspath     ブートストラップ・クラス・ファイルの場所をオーバーライドする

D:\Test1>

関連の記事

JDKのインストールと環境変数の設定

△上に戻る