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调用站点说明符解析的结果是一个元组,其中包含:
\n\n\xe2\x80\xa2 对 的实例的引用
\n\njava.lang.invoke.MethodHandle,\xe2\x80\xa2 对 的实例的引用
\n\njava.lang.invoke.MethodType,\n
Class\xe2\x80\xa2 对、java.lang.invoke.MethodHandle、\njava.lang.invoke.MethodType和实例的引用String。
我们还有所谓的调用站点对象https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokedynamic:
\n\n\n\n\n\n
java.lang.invoke.CallSitebootstrap 方法返回的结果必须是对其类为\n或其子类的\n 对象 的引用java.lang.invoke.CallSite。该对象称为调用站点\n对象
调用站点对象的概念很清晰。这只是一个例子CallSite。但是调用站点说明符又如何呢?那是一个Java对象吗?这是String字面意思吗?
动态调用站点是指令的每次出现invokedynamic。
在 JVM 可以执行动态调用站点(指令)之前,必须首先链接
invokedynamic该调用站点。链接是通过调用引导方法来完成的,该方法被赋予调用站点的静态信息内容,并且必须生成给出调用站点的行为的方法句柄。// 来自java.lang.invoke包描述
调用站点说明符是一个项目(从常量池获得),描述如何链接给定的调用站点。
没有具体说明该物品到底是什么。
JVMS 仅告诉调用站点说明符的符号引用在常量池中的样子。
JVM 实现可以自由选择调用站点说明符的内部表示。它可以是堆中的一个对象,也可以是本机内存中的一段元数据。例如,HotSpot JVM 将调用站点说明符缓存为对象数组,其中第一个元素是表示引导方法的实例MethodHandle,其余元素是调用此引导方法的参数。
无论调用站点说明符在 JVM 内部如何实现,当它被解析时,它都应该生成一个java.lang.invoke.CallSite永久绑定到动态调用站点的调用站点对象( 的实例)。