java 字节码指令操作

323 阅读1分钟

idea 配置指令码查看快捷

Program : 填写jdk => bin => javap.exe 路径
Arguments : -c $FileClass$
Working directory : $OutputPath$

解释 i++ 与 ++i 指令码区别

  /**
     * @description:
     *        0: iconst_0  //int 0 入栈顶
     *        1: istore_1  // 将栈顶值存入给第一个局部变量
     *        2: iconst_0  // int 0 入栈顶
     *        3: istore_2  // 将栈顶值存入给第二个局部变量
     *        4: iload_1   // 将第一个局部变量值推送至栈顶
     *        5: iinc          1, 1  //将第一个局部变量自增 eg:此时局部变量表 a = 1;
     *        8: istore_1  // 将栈顶值存入第一个局部变量 eg:此时栈顶值为 0 故 a = 0;
     *        9: getstatic     #2  //调用常量池 标识符为#2 的方法  // Field java/lang/System.out:Ljava/io/PrintStream;
     *       12: iload_1   // 将第一个局部变量值推送至栈顶 eg:栈顶为0
     *       13: iinc          1, 1 //将第一个局部变量自增 eg:此时局部变量表 a = 1;
     *       16: invokevirtual #3   //输出栈顶值eg:栈顶为0;  // Method java/io/PrintStream.println:(I)V
     *       19: iinc          2, 1 //将第二个局部变量自增 eg:局部变量表 b = 1;
     *       22: iload_2    // 将第二个局部变量b 推送至栈顶 eg:栈顶值为 1;
     *       23: istore_2   // 将栈顶值存入第二个局部变量 eg: b = 1;
     *       24: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
     *       27: iload_2     // 局部变量 b 上栈顶  eg:栈顶 1
     *       28: invokevirtual #3  //输出栈顶值eg:栈顶为1  // Method java/io/PrintStream.println:(I)V
     *       31: return
     * @return void
     * @author: xpy
     * @time 2019/12/5 10:57
     */

    @Test
    public void test1(){
        int a=0,b=0;
        a = a++;
        System.out.println(a);
        b = ++b;
        System.out.println(b);
    }