2010-02-28

javac が生成するバイトコードの調べ方

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

コメントを投稿