首先来看一段代码
public String method111() { String ret = "hello"; try { return ret; } finally { ret = "world"; } }
最终返回什么呢?可能你知道,但是相信有一部分人是懵了的,因为我们都知道try-finally代码中finally模块最终一定会执行。下面咱们通过java字节码指令来看看到底发生了什么。
首先找到.class文件,然后执行
javap -verbose Test.class >tt.tx
然后保存到tt.txt文件中
public java.lang.String method111(); descriptor: ()Ljava/lang/String; flags: ACC_PUBLIC Code: stack=1, locals=4, args_size=1 0: ldc #2 //把常量池中的常量压到操作数栈里// String hello 2: astore_1 //然后存到本地变量1中 3: aload_1 //加载本地变量1到操作数栈 4: astore_2 //再把它保存到本地变量2中 5: ldc #3 //把常量池中的常量压到操作数栈里// String world 7: astore_1 //然后存到本地变量1中 8: aload_2 //加载本地变量2到操作数栈 9: areturn //返回栈里的数据 hello 因为本地变量保存的是hello 10: astore_3 11: ldc #3 // String world 13: astore_1 14: aload_3 15: athrow Exception table: from to target type 3 5 10 any LineNumberTable: line 7: 0 line 9: 3 line 11: 5 line 9: 8 line 11: 10 LocalVariableTable: Start Length Slot Name Signature 0 16 0 this Lcom/u2jinfu/com/requestbank/controller/Test;
3 13 1 ret Ljava/lang/String;
.....其他部分省略
由字节码指令可以看出,显示把hello保存到本地变1和本地变量2中。后面返回的是本地变量2,所以返回的就是hello,通过现象看本质。
Java字节码指令可以参考官方的,也可以参考一个中文翻译的:
https://www.cnblogs.com/longjee/p/8675771.html