invokeinterface - 计数值

Nos*_*kol 1 java jvm bytecode

我试图理解 JVM 字节码,但我遇到了以下代码:

58: invokeinterface #5,  1            // InterfaceMethod java/util/List.stream:()Ljava/util/stream/Stream;
63: invokedynamic #6,  0              // InvokeDynamic #0:test:()Ljava/util/function/Predicate;
68: invokeinterface #7,  2            // InterfaceMethod java/util/stream/Stream.filter:(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;
Run Code Online (Sandbox Code Playgroud)

似乎数值总是nargs + 1(在 58 中:应该是 0 但为 1,在 68 中:应该是 1 但为 2)。

根据JVM 文档

计数操作数是一个不能为零的无符号字节

这就是为什么一些参数似乎是nargs + 1 的原因吗?

apa*_*gin 5

thisobject(objectref在 JVMS 中调用)始终是invokeinterface. 它与其他nargs参数一起在操作数堆栈上传递。

实际上,count不是参数的数量,而是传递参数所需的堆栈槽数。实际上,现代 JVM 通常不使用此字节,请参阅注释

invokeinterface 指令的计数操作数记录参数值数量的度量,其中 long 或 double 类型的参数值对计数值贡献两个单位,而任何其他类型的参数贡献一个单位。该信息也可以从所选方法的描述符中获得。冗余是历史性的。