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

时间:2018-03-21 18:37:18

标签: java methods jvm invokedynamic

我正在尝试了解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

实例的引用      

•对Classjava.lang.invoke.MethodHandle实例的引用,   java.lang.invoke.MethodTypeString

我们还有所谓的呼叫站点对象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字面量吗?

1 个答案:

答案 0 :(得分:1)

  • 动态呼叫网站invokedynamic指令的每次出现。

      

    在JVM可以执行动态调用站点之前(invokedynamic   指令),呼叫站点必须首先链接。链接是   通过调用给定静态的引导方法来完成   呼叫站点的信息内容,必须产生一种方法   提供调用站点行为的句柄。

         

    //来自java.lang.invoke package description

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

    未指定此项目的真实含义。
    JVMS仅告知常量池中调用站点说明符symbolic referencelooks like

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

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