写一段代码
public static int func(){
int i = 10;
try{
return i;
}finally {
i = 100;
}
}
在main方法中打印方法func()的返回值,来查看返回值
结果为10,并不是被修改之后的100。
使用javap反编译这个类来获取虚拟机指令,javap -c class文件
先了解几个简单的jvm指令:
bipush # ------加载一个常量x到操作数栈
istore_# -------将操作数栈顶的数据存储到局部变量表的#号槽位
iload_# -------将局部变量表#号槽位的数据加载到操作数栈
ireturn --------返回操作数栈顶的值
分析返回值为10的原因。分析反编译结果如下:
做个图解:
可以看到其实底层是将i复制了一份,然后将原来的数据改变,返回复制的i。