【发布时间】:2015-05-03 08:27:45
【问题描述】:
查看这个 Java 字节码(来自 Eclipse 类文件查看器),我注意到 invokeinterface 指令有些奇怪:它有一个占用 2 个字节的 nargs(参数数量)“属性”:
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]
为什么会这样? invokeinterface 和 invokevirtual 有什么区别? JVM 不应该能够从给定的方法签名中推断出参数的数量(从而从堆栈中弹出的值的数量)吗?
【问题讨论】: