背景
我目前正在用 C# 编写一个 JVM,纯粹是为了学术目的(将来可能会构建一个混合的 .NET 和 Java/Scala 应用程序)。
语境
我编写了简单的JAVA类:
public class test
{
public static String hello_world(int i)
{
return "Hello " + i + " World!";
}
}
并将其编译成test.class
. 当我用我的反编译器(我作为 JVM 的一部分编写的)反编译它时,我看到了这个方法的以下说明:
iload_0
invokedynamic 2
areturn
在常量池中查看 index 处的常量时2
,我看到一个 InvokeDynamic-Constant 条目,其中包含以下数据:
makeConcatWithConstants : (I)Ljava/lang/String;
我想这是有道理的(我更像是 .NET 用户而不是 JAVA 用户)。
hello_world
使用参数执行我的方法时1
,在执行之前我有以下堆栈invokedynamic 2
:
----TOP---
0x00000001
--BOTTOM--
问题
我的问题是:我该如何使用invokedynamic
?
我无法解析该方法makeConcatWithConstants
,因为 InvokeDynamic-Constant 没有给我任何提示,makeConcatWithConstants
可能位于何处(请参阅文档)。
堆栈也不包含对堆的引用,指示该方法makeConcatWithConstants
可以与哪个实例类型相关联。
我通读了invokedynamic
文档,但我不明白(也许我被 .NET-Framework 严重“损坏”了)。
有人可以给我举一些例子,说明在执行这三个指令时 JVM 引擎盖下发生了什么?(被调用者invokedynamic
期望什么等)?
我已经invokestatic
在我的 JVM 中实现了……但我目前无法理解invokedynamic
。