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 件のコメント:
コメントを投稿