invokedynamic #2, 0 第二个参数0到底是什么意思?

step1.测试代码

public class Simple {
    public static void target(int i) { }

    public static void main(String[] args) throws Exception {
        ((IntConsumer) TestV6::target).accept(1);
    }
}

字节码如下

  public static void main(java.lang.String[]) throws java.lang.Exception;
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: invokedynamic #2,  0              // InvokeDynamic #0:accept:()Ljava/util/function/IntConsumer;
         5: iconst_1
         6: invokeinterface #3,  2            // InterfaceMethod java/util/function/IntConsumer.accept:(I)V
        11: return
      LineNumberTable:
        line 16: 0
        line 17: 11
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      12     0  args   [Ljava/lang/String;
    Exceptions:
      throws java.lang.Exception

step2.查询 Java虚拟机规范(Java SE 8版)

invokedynamic对应的操作码 0xba
iconst_1对应的操作码是0x04
invokeinterface对应的操作码是0xb9

0: invokedynamic #2, 0
5: iconst_1
6: invokeinterface #3, 2
可知invokedynamic有四字节的参数

invokedynamic #2, 0 第二个参数0到底是什么意思?_第1张图片

step3.十六进制class文件进行验证

参考class文件示例,定位到invokedynamic指令处:

ba 00 02 00 00 invokedynamic
04 iconst_1
b9 invokeinterface

可知invokedynamic的参数为00 02 00 00,
因此invokedynamic #2, 0中的#2由前两个字节得来,后面的0由三、四字节得来,而且一直是0.

你可能感兴趣的:(invokedynamic #2, 0 第二个参数0到底是什么意思?)