分析操作数栈和局部变量表配合的字节码指令

    public int getSum(){
        int i = 12;
        int j = 5;
        int k = i + j;
        return k;

    }

    public void testGetSum() {
        int i = getSum();
        int j = 16;
    }

上面两个方法对应的字节码指令
getSum方法

 0 bipush 12
 2 istore_1
 3 iconst_5
 4 istore_2
 5 iload_1
 6 iload_2
 7 iadd
 8 istore_3
 9 iload_3
10 ireturn

testGetSum方法

0 aload_0  //把this从局部变量表中读取,压入操作数栈中
1 invokevirtual #7   //利用this调用getSum方法,返回值保存在栈中
4 istore_1  //将栈中的数保存到局部变量表中的slot 1
5 bipush 16 //将16压入操作数栈
7 istore_2 //从操作数栈中读取,存放到局部变量表slot 2的位置
8 return

总结
push是将操作数压入栈中
store是将操作数从栈中取出,然后存入到局部变量表
load是从局部变量表中将操作数读出,放入栈中
add是在栈中做操作数的相加运算,运算结果依然保存在栈中

你可能感兴趣的:(分析操作数栈和局部变量表配合的字节码指令)