Decompile A Java Class File

2014/07/14

先给出一段简单的代码如下:

public class Test {
    public static void main(String[] args) {
        int j = 0;
        for (int i = 0; i < 7 ; i ++) {
            j = j++;
        }
        System.out.println(j);
    }
}

程序输出为0,有点不解,Google后发现是“Java中间缓存变量机制”,还是不清不楚。所以使用javap对编译后的class文件进行分析。

指令为:

javac Test.java
javap -c Test

得到如下代码:

Compiled from "Test.java"
public class Test {
  public Test();
    Code:
      0: aload_0
      1: invokespecial #1                  // Method java/lang/Object."<init>":()V
      4: return
  // 程序主入口
  public static void main(java.lang.String[]);
    Code:
    0: iconst_0                //int型常量值0进栈
    1: istore_1                //将栈顶int型数值存入第二个局部变量
    2: iconst_0                //int型常量值0进栈
    3: istore_2                //将栈顶int型数值存入第三个局部变量
    4: iload_2                //将第三个int型局部变量进栈
    5: bipush        7        //将一个byte型常量值推送至栈顶
    7: if_icmpge     21        //栈顶两整数比较,若结果大于0就跳转到21
    10: iload_1                //将第二个int型局部变量进栈
    11: iinc          1, 1     //指定int型变量增加指定值
    14: istore_1                //将栈顶int型数值存入第二个局部变量
    15: iinc          2, 1     //指定int型变量增加指定值
    18: goto          4         //跳转4
    21: getstatic     #2      //获取指定类的静态域,并将其值压入栈顶
    24: iload_1                //将第三个int型局部变量进栈
    25: invokevirtual #3      //调用实例方法
    28: return
}