javac がどのようなバイトコードを吐いているかを知るにはどうすればいいだろうか?
class test {
String f(String s, int n) { return s + n; }
}
この test.java のバイトコードを調べてみよう.
$ vi test.java
$ javac test.java
$ javap -c test
Compiled from "test.java"
class test extends java.lang.Object{
test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
java.lang.String f(java.lang.String, int);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: iload_2
12: invokevirtual #5; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
15: invokevirtual #6; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
18: areturn
}
まとめ
-
javap -c classnameでクラスファイルの「逆アセンブル」ができる.
0 件のコメント:
コメントを投稿