jvm常用指令以及演示一文中详细演示了jvm常用的指令,本文算是对上文的一个延续说明,依次加深印象。本文演示的语句附有一个if判断并且处理异常这种情况,我们再次基础之上再来观察一下指令的变化。
public void addPerson(int age) { if (age > 1) { this.age = age; } else { throw new IllegalArgumentException(); } }
首先判断age参数,如果大于1就将其赋值到this.age字段中,否则抛出一个例外。
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附有分支语句指令观察