使用javap分析return和finally的执行字节码
package com.****.test1;/** * try-finally的执行 * @author jame * @date 2011年9月1日11:14:01 */public class ReturnTest {public static void main(String[] args) {System.out.println("main method:"+ReturnTest.test());}static int test(){int x = 1;try{return x;}finally{++x;System.out.println("finally:"+x);}}}Compiled from "ReturnTest.java"public class com.skyon.test1.ReturnTest extends java.lang.Object{public com.skyon.test1.ReturnTest();//初始化工作 Code: 0: aload_0 //将局部变量0位置对象取出来,压入栈push 1: invokespecial #1; //Method java/lang/Object."<init>":()V //调父类构造函数 4: return //返回本函数public static void main(java.lang.String[]); Code: 0: getstatic #2; //Field a/lang/System.out:Ljava/io/PrintStream;//取出静态成员变量push入栈,常量解析池中的#2位置 3: invokestatic #3; //Method test:()I//调用test()方法 6: invokevirtual #4; //Method java/io/PrintStream.println:(I)V//调用println()方法 9: returnstatic int test(); Code: 0: iconst_1 //将x变量的初始值1放入操作数栈 1: istore_0 //将栈顶元素保存到局部变量位置0,pop 2: iload_0 //将局部变量0位置对象取出来,压入栈push 3: istore_1 //将栈顶元素保存到局部变量位置1,pop 4: iinc 0, 1 //将栈顶元素自加1再入栈 7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 10: iload_0 11: invokevirtual #4; //Method java/io/PrintStream.println:(I)V 14: iload_1 15: ireturn 16: astore_2 17: iinc 0, 1 20: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 23: iload_0 24: invokevirtual #4; //Method java/io/PrintStream.println:(I)V 27: aload_2 28: athrow Exception table: from to target type 2 4 16 any 16 17 16 any