Java字节码调用接口指令

时间:2015-03-02 20:41:53

标签: java jvm

看看这个Java字节码(来自Eclipse ClassFile查看器),我注意到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是否能够从给定的方法签名中推断出参数的数量(从而从堆栈中弹出的值的数量)?

1 个答案:

答案 0 :(得分:7)

您可以从签名中推断出参数的数量。 JVM spec对此有这样的说法:

&#34; invokeinterface指令的计数操作数记录参数值数量的度量,其中long或double类型的参数值为计数值提供两个单位,任何其他类型的参数贡献一个单元。该信息也可以从所选方法的描述符中导出。 冗余是历史性的。&#34;