Java中调用方法时的调用点是什么?

Som*_*ame 4 java methods jvm invokedynamic

我试图了解什么是 JVM 中的调用站点。引用自https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.4.3.6

\n\n
\n

调用站点说明符解析的结果是一个元组,其中包含:

\n\n

\xe2\x80\xa2 对 的实例的引用java.lang.invoke.MethodHandle

\n\n

\xe2\x80\xa2 对 的实例的引用java.lang.invoke.MethodType

\n\n

Class\xe2\x80\xa2 对、java.lang.invoke.MethodHandle、\n java.lang.invoke.MethodType和实例的引用String

\n
\n\n

我们还有所谓的调用站点对象https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokedynamic

\n\n
\n

java.lang.invoke.CallSitebootstrap 方法返回的结果必须是对其类为\n或其子类的\n 对象 的引用java.lang.invoke.CallSite。该对象称为调用站点\n对象

\n
\n\n

调用站点对象的概念很清晰。这只是一个例子CallSite。但是调用站点说明符又如何呢?那是一个Java对象吗?这是String字面意思吗?

\n

apa*_*gin 8

  • 动态调用站点是指令的每次出现invokedynamic

    在 JVM 可以执行动态调用站点(指令)之前,必须首先链接invokedynamic 该调用站点。链接是通过调用引导方法来完成的,该方法被赋予调用站点的静态信息内容,并且必须生成给出调用站点的行为的方法句柄。

    // 来自java.lang.invoke包描述

  • 调用站点说明符是一个项目(从常量池获得),描述如何链接给定的调用站点。

    没有具体说明该物品到底是什么。
    JVMS 仅告诉调用站点说明符的符号引用在常量池中的样子。

    JVM 实现可以自由选择调用站点说明符的内部表示。它可以是堆中的一个对象,也可以是本机内存中的一段元数据。例如,HotSpot JVM 将调用站点说明符缓存为对象数组,其中第一个元素是表示引导方法的实例MethodHandle,其余元素是调用此引导方法的参数。

    无论调用站点说明符在 JVM 内部如何实现,当它被解析时,它都应该生成一个java.lang.invoke.CallSite永久绑定到动态调用站点的调用站点对象( 的实例)。