最近,書き換えまくっています.
そのせいか,
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");