当前位置: 首页 > 知识库问答 >
问题:

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

班昱
2023-03-14

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

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

•对java实例的引用。lang.invoke。方法句柄

•对java实例的引用。lang.invoke。方法类型

Classjava.lang.invoke.metodHandlejava.lang.invoke.metodTypeString实例的引用。

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

bootstrap方法返回的结果必须是对类为java.lang.invoke.CallSite的对象的引用,或者是java.lang.invoke.CallSite的子类

调用站点对象的概念很清楚。这只是CallSite的一个实例。但是调用站点说明符呢?这是一个Java对象吗?这是一个String文本吗?

共有1个答案

邢冷勋
2023-03-14

>

  • 动态调用站点是每一次发生的invokedynamic指令。

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

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

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

    它没有具体说明这个项目到底是什么
    JVM只告诉调用站点说明符的符号引用在常量池中的样子。

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

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

  •  类似资料:
    • 问题内容: 我已经在某些计算机科学测试中看到了下一段,希望我能在这里对它的含义有一个很好的解释,因为我用它搜索了一个小时,却找不到任何东西。 “当我们说Java语言具有 虚拟方法调用时 ,是指在Java应用程序中,执行的方法由运行时的对象类型决定” 这是什么意思?谁能更好地解释它? 问题答案: 这些行的作者使用的C ++术语。 更好的术语是动态绑定/动态调度。 这意味着,对象的动态类型是“选择”将

    • 问题内容: 我需要知道何时在中调用该方法。我创建了一个测试类,该法通过覆盖该方法来在调用该方法时将其写入文件。它不执行。谁能告诉我它为什么不执行的原因? 问题答案: 通常,最好不要依赖进行任何清理等工作。 根据Javadoc(值得阅读),它是: 当垃圾回收确定不再有对该对象的引用时,由垃圾回收器在对象上调用。 正如Joachim指出的那样,如果对象始终是可访问的,则在程序生命中可能永远不会发生这种

    • 问题内容: 我想在Qt中使用JNI调用Android Java方法。我无法理解一个奇怪的“方法签名”参数。这是什么,我应该如何设置? 在示例中,它类似于或。这是什么意思? 例如: 问题答案: 所有这些都在文档中进行了说明。 http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html 您的方法采用两个整数作为参数

    • 本文向大家介绍Java调用方法,包括了Java调用方法的使用技巧和注意事项,需要的朋友参考一下 示例 使用反射,可以在运行时调用对象的方法。 该示例显示了如何调用String对象的方法。            

    • 那么当我使用调用异步方法时会发生什么呢?整个方法的操作会以同步的方式完成吗?例如,如上面所示,我在中有三个异步操作;、&,那么它们是否会以同步方式执行,因为我使用.wait()调用ScanAsync方法?

    • 问题内容: 我了解什么是Java方法调用,并使用它练习了很多示例。 我想知道这个概念的实际情况或需要。如果有人能给出使用它的真实场景,这将有很大帮助,如果没有这个概念,将会发生什么? 问题答案: 这是一个例子。假设我们有2个类别: 如果我们现在执行以下操作: 我们得到结果 如果Java没有,它将在编译时确定要调用的是属于该类的。既然不是,而是在运行时根据所指向的实际类来确定,则可以得到以上结果。