Java.lang.invoke软件包提供了与Java虚拟机交互的低级基元。
如Java虚拟机规范中所述,此程序包中的某些类型由虚拟机进行特殊处理:
类MethodHandle VarHandle包含signature polymorphic methods ,无论其类型描述符如何,都可以链接。 通常,方法链接需要类型描述符的精确匹配。
JVM字节码格式支持类MethodHandle和MethodType的立即常量。
invokedynamic指令使用bootstrap MethodHandle常量来动态解析CallSite对象以获取自定义方法调用行为。
ldc指令使用bootstrap MethodHandle常量来动态解析自定义常量值。
呼叫站点和常量的动态分辨率
以下低级信息总结了Java虚拟机规范的相关部分。 有关完整详细信息,请参阅该规范的当前版本。
动态计算的呼叫站点
invokedynamic指令最初处于未链接状态。 在这种状态下,没有指令调用的目标方法。
在JVM可以执行invokedynamic指令之前,必须首先链接指令。 链接是通过调用一个bootstrap方法来完成的,该方法被赋予调用的静态信息内容,并且必须产生一个给出调用行为的CallSite 。
每个invokedynamic指令将其自己的引导方法静态指定为常量池引用。 常量池引用还指定了调用的名称和方法类型描述符,就像invokestatic和其他调用指令一样。
动态计算常量
常量池可能包含标记为CONSTANT_Dynamic常量,配有执行其分辨率的引导方法。 这种动态常数最初处于未解决状态。 在JVM可以使用动态计算常量之前,必须先解决它 。 动态计算的恒定分辨率是通过调用一个bootstrap方法来完成的