一.JAVA部分字节码
上次听说吧,好像finally能覆盖return 嗯?在我学习中从来没有return后还能执行的东西。感觉有点儿见鬼。想看看它的机器码长什么样子?
我想知道究竟是在函数中return后又执行的finally的return?还是一起执行取finally作为结果?还是只执行finally的return?
不幸的是JAVA使用了JAVA字节码而不是汇编,但看起来好像理解了汇编这也没什么难的.
嘛,幸运的是我只想看看JAVA字节码finally双返回是怎么编译的,了解一点儿就行了。
二.反编译java语言到字节码
finally自带返回 了覆盖try中返回
JDK自带强大的工具,cmd中javap 类名就可以反编译。
我先写一段简单的try-catch-finally试一下。
这个逻辑我让finally返回
package test;
import java.util.*;
public class Test {
public boolean method()
{
try
{
return false;
}catch (Exception a)
{
return true;
}
finally
{
return true;
}
}
}
逻辑简单到令人发指
javac Test.java 先编译
javap Test 再反编译
public class test.Test {
public test.Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public boolean method();
Code:
0: iconst_0
1: istore_1
2: iconst_1
3: ireturn
4: astore_1
5: iconst_1
6: istore_2
7: iconst_1
8: ireturn
9: astore_3
10: iconst_1
11: ireturn
Exception table:
from to target type
0 2 4 Class java/lang/Exception
0 2 9 any
4 7 9 any
}
额,虽然我看不懂具体意思,但三个return 我还是看得到的。
3,8,11行都有返回语句。try-catch-finally的返回
但底下的异常表,根据
0-2行中出现exception类转到第4行。这应该就是我catch的exception.
0-2行应该是我的try块儿。
0-2行无论出现什么情况都会转到第9行。
意味着try块儿中的第三行return 其实被跳过了。
下面考虑0-2出现异常转到第4行
根据异常表4-7行也在任何情况跳转到第9行
那么第8行return 也被跳过了。
所以无论在什么情况都会跳过这几个return只有finally的return 会执行。