`
onedaykoo
  • 浏览: 24602 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用javap分析return和finally的执行字节码

    博客分类:
  • J2SE
阅读更多
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 数组对象
1
1
分享到:
评论
2 楼 onedaykoo 2011-09-02  
黑白两相望 写道
我想知道你的字节码是从命令行拷出来的吗?后面的注释是后面加上的? 还是说用了什么插件?


恩,是的。不是插件。
1 楼 黑白两相望 2011-09-01  
我想知道你的字节码是从命令行拷出来的吗?后面的注释是后面加上的? 还是说用了什么插件?

相关推荐

Global site tag (gtag.js) - Google Analytics