盘古BPM体验地址    盘古BPM交流群盘古BPM交流群号:963222735

jvm附有分支语句指令观察

分享牛 1607℃

jvm常用指令以及演示一文中详细演示了jvm常用的指令,本文算是对上文的一个延续说明,依次加深印象。本文演示的语句附有一个if判断并且处理异常这种情况,我们再次基础之上再来观察一下指令的变化。

我们先来写一个实例代码,如下所示:

public void addPerson(int age) {    
        if (age > 1) {    
            this.age = age;    
        } else {    
            throw new IllegalArgumentException();    
        }    
    }

首先判断age参数,如果大于1就将其赋值到this.age字段中,否则抛出一个例外。

 然后看一下addPerson方法的字节码如下:

   0: iload_1
   1: iconst_1
   2: if_icmple     13
   5: aload_0
   6: iload_1
   7: putfield      #20
  10: goto          21
  13: new           #24
  16: dup
  17: invokespecial #26
  20: athrow
  21: return

这里我们来对上述的字节码指令进行解析说明。详情如下:

    第一行(iload_1)和第二行(iconst_1)指令分别是把参数age以及常量1 从局部变量表压入操作数栈。

这个地方不必惊讶,如果加载的是常量2 的话,对应的指令为iconst_2。

    第三行指令,也就是条件语句的比较指令,比较操作数栈顶,第一条第二条指令对应的值的大小,如果不满足比较条件,就会跳转到字节码的13 这个位置(  13: new           #24)。也即是进入到异常处理。

    第四行指令到第六行指令就是我们前面一篇介绍过的,如同setBean 方法一样的。对于field的赋值操作。

    第七行 goto 指令,无条件跳转到字节码参数所指定的十二行return指令的位置,方法返回,清空方法栈。

    第八行(13: new)开始是异常处理。这里先是new 指令创建一个Exception对象,并且将其压入操作数栈。

    第九行指令复制刚才的对象,并且压入操作数栈。

    第十行(  17: invokespecial)是将其中一个Exception对象出栈,并调用其构造器方法。

    第十一行将另外一个对象出栈,并且抛出异常,所以也是清空、结束了当前的方法栈。

注意:#26为所索引为26 的常量信息,这个前面文章详细说明过。


转载请注明:分享牛 » jvm附有分支语句指令观察