使用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: return

static 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


常见指令:
1、putstatic #5;
--putstatic当栈顶元素出栈放到常量解析池中的#5位置
2、iconst_1
--int常量1放入操作数栈
3、aload_0
--将局部变量0位置对象取出来,压入栈push
4、invokespecial #1; //Method java/lang/Object."<init>":()V
--调用父类构造方法,并出栈pop
5、putfield #2; //Field A:[I
--putfield指把栈顶对象pop,然后赋值给常量解析池中的#2位置
6、getstatic #3; //Field/lang/System.out:Ljava/io/PrintStream;
--取出静态成员变量push入栈,常量解析池中的#3位置
7、 dup
--复制当前栈顶对象,再压入栈push
8、astore_1
--将返回对象放到局部变量位置1,pop
9、istore_2
--将栈顶元素保存到局部变量位置2,pop
10、iinc 2, 1
--将栈顶元素自加1再入栈
11、invokevirtual #8; //Method java/io/PrintStream.println:(I)
--调用打印方法
12、 bipush 6
--bipush将(byte)字节形转换成(int)整形,并且压入栈push
13、iastore
--数据元素操作指令:在位置上放入刚存入的值pop 1 ;pop 0; pop 数组对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值