Prev / Next / たまにっき。

Java バイトコード

Category: [Java]
2003-05-12

最近,書き換えまくっています.
そのせいか,

javap -c classname


で出力されるバイトコードを呼んでも普通に Java のコードを思い浮かべられるようになった.f(^^;

例えば

Method void test()
   0 iconst_1
   1 istore_1
   2 iconst_2
   3 istore_2
   4 iload_1
   5 iload_2
   6 iadd
   7 istore_3
   8 iload_3
   9 iload_2
  10 imul
  11 istore_1
  12 getstatic #2 <Field java.io.PrintStream out>
  15 new #3 <Class java.lang.StringBuffer>
  18 dup
  19 invokespecial #4 <Method java.lang.StringBuffer()>
  22 ldc #5 <String "x: ">
  24 invokevirtual #6 <Method java.lang.StringBuffer append(java.lang.String)>
  27 iload_1
  28 invokevirtual #7 <Method java.lang.StringBuffer append(int)>
  31 ldc #8 <String ", y: ">
  33 invokevirtual #6 <Method java.lang.StringBuffer append(java.lang.String)>
  36 iload_2
  37 invokevirtual #7 <Method java.lang.StringBuffer append(int)>
  40 ldc #9 <String ", z: ">
  42 invokevirtual #6 <Method java.lang.StringBuffer append(java.lang.String)>
  45 iload_3
  46 invokevirtual #7 <Method java.lang.StringBuffer append(int)>
  49 invokevirtual #10 <Method java.lang.String toString()>
  52 invokevirtual #11 <Method void println(java.lang.String)>
  55 getstatic #2 <Field java.io.PrintStream out>
  58 ldc #12 <String "x: 6, y: 2, z: 3">
  60 invokevirtual #11 <Method void println(java.lang.String)>
  63 return


をそのまま Java のコードに直すと以下のようになる.

int data1 = 1;
int data2 = 2;
int data3 = data1 + data2;
data1 = data3 * data2;
PrintStream out = System.out;
StringBuffer stringbuffer1 = new StringBuffer();
stringbuffer1.append("x: ");
stringbuffer1.append(data1);
stringbuffer1.append("y: ");
stringbuffer1.append(data2);
stringbuffer1.append("z: ");
stringbuffer1.append(data3);
out.println(stringbuffer1.toString());
out.println("x: 6, y: 2, z: 3");


変数名はこの情報からは読めないので,適当に付けている.
ちなみに,元のコード.

int x = 1;
int y = 2;
int z = x + y;
x = z * y;
System.out.println("x: " + x + ", y: " + y + ", z: " + z);
System.out.println("x: 6, y: 2, z: 3");


Category: [Java]