Lable是ASM的一个概念,当我在下一条PC指令执行前传入一个Label对象调用MethodVisitor.visitLabel方法,这个Label对象就能够用来表示下一条指令的位置。我们可以简单的认为Label就是class字节码每一条指令的位置
他的作用有两个:程序跳转和范围划定
在字节码层面,并没有if…else if…else的概念,那么这些条件分支的操作是如何实现的呢,就是通过goto语句或带有跳转性质的指令和label标签一起完成的。比如如下指令:
ifeq <label>表示如果栈顶元素等于0则跳转到label位置。
假如有个方法
public static void say(boolean say){ if(say) { System.out.println("I say : Go "); } else { System.out.println("nothing"); } }
0 iload_0 [say] 1 ifeq 15 4 getstatic java.lang.System.out : java.io.PrintStream [20] 7 ldc <String "I say : Go "> [26] 9 invokevirtual java.io.PrintStream.println(java.lang.String) : void [28] 12 goto 23 15 getstatic java.lang.System.out : java.io.PrintStream [20] 18 ldc <String "nothing"> [34] 20 invokevirtual java.io.PrintStream.println(java.lang.String) : void [28] 23 return
这里每一行的数字表示当前这条指令的PC, true和false在字节码中分别用1和0表示,所以上面的代码可以看到