通过从Eclipse ClassFile查看器查看此Java字节码,我注意到invokeinterface指令有一些奇怪之处:它具有一个nargs(参数数量)“属性”,占2个字节:

35  aload_2 [map]
36  ldc <String "a"> [15]
38  invokeinterface java.util.Map.get(java.lang.Object) : java.lang.Object [33] [nargs: 2]
43  checkcast java.lang.String [35]
46  invokevirtual java.io.PrintStream.println(java.lang.Object) : void [47]
49  getstatic java.lang.System.out : java.io.PrintStream [41]


为什么存在? invokeinterfaceinvokevirtual有什么区别? JVM是否不能从给定的方法签名中推断出参数的数量(因此要从堆栈中弹出的值的数量)?

最佳答案

没错,可以从签名中推断出参数的数量。 JVM spec可以这样说:

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

关于java - Java字节码invokeinterface指令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28819070/

10-12 04:04
查看更多