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>
関連の記事