我正在尝试了解JVM中的调用站点。引自https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.4.3.6
调用站点说明符解析的结果是由以下内容组成的元组:
•对
实例的引用java.lang.invoke.MethodHandle
,•对
实例的引用java.lang.invoke.MethodType
,•对
Class
,java.lang.invoke.MethodHandle
实例的引用,java.lang.invoke.MethodType
和String
。
我们还有所谓的呼叫站点对象https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokedynamic:
bootstrap方法返回的结果必须是对a的引用 类为
java.lang.invoke.CallSite
或其子类的对象java.lang.invoke.CallSite
。此对象称为呼叫站点 对象
呼叫站点对象概念很明确。这只是CallSite
的一个实例。但是呼叫站点说明符怎么样?那是一个Java对象吗?那是String
字面量吗?
答案 0 :(得分:1)
动态呼叫网站是invokedynamic
指令的每次出现。
在JVM可以执行动态调用站点之前(
invokedynamic
指令),呼叫站点必须首先链接。链接是 通过调用给定静态的引导方法来完成 呼叫站点的信息内容,必须产生一种方法 提供调用站点行为的句柄。
呼叫站点说明符是一个项目(从常量池中获取),描述如何链接给定的呼叫站点。
未指定此项目的真实含义。
JVMS仅告知常量池中调用站点说明符symbolic reference的looks like。
JVM实现可以自由选择调用站点说明符的内部表示。它可以是堆中的对象,也可以是本机内存中的一段元数据。例如,HotSpot JVM将调用站点说明符缓存为object array,其中第一个元素是表示引导方法的MethodHandle
实例,其余元素是调用此引导方法的参数。
无论在JVM中如何实现调用站点说明符,在解析时,它都应该生成一个永久绑定到动态调用站点的调用站点对象(java.lang.invoke.CallSite
的实例)。