gpt4 book ai didi

Java 字节码调用接口(interface)指令

转载 作者:行者123 更新时间:2023-11-29 06:32:45 27 4
gpt4 key购买 nike

查看此 Java 字节码(来自 Eclipse 类文件查看器),我注意到 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 字节码调用接口(interface)指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28819070/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com