使用javap分析return和finally的執行字節碼

常見指令:
一、putstatic       #5;
--putstatic當棧頂元素出棧放到常量解析池中的#5位置
二、iconst_1
--int常量1放入操做數棧
三、aload_0
--將局部變量0位置對象取出來,壓入棧push  
四、invokespecial   #1; //Method java/lang/Object."<init>":()V
--調用父類構造方法,並出棧pop
五、putfield        #2; //Field A:[I
--putfield指把棧頂對象pop,而後賦值給常量解析池中的#2位置
六、getstatic       #3; //Field/lang/System.out:Ljava/io/PrintStream;
--取出靜態成員變量push入棧,常量解析池中的#3位置
七、 dup
--複製當前棧頂對象,再壓入棧push
八、astore_1
--將返回對象放到局部變量位置1,pop  
九、istore_2   
--將棧頂元素保存到局部變量位置2,pop
十、iinc    2, 1
--將棧頂元素自加1再入棧 學不完的技術,如何定位很重要?
十一、invokevirtual   #8; //Method java/io/PrintStream.println:(I)
--調用打印方法
十二、 bipush  6 
--bipush將(byte)字節形轉換成(int)整形,而且壓入棧push
1三、iastore          
--數據元素操做指令:在位置上放入剛存入的值pop 1 ;pop 0; pop 數組對象html

package com.****.test1;java


/**
 * 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
相關文章
相關標籤/搜索