java.lang.Object
java.lang.invoke.CallSite
java.lang.invoke.MutableCallSite
jdk.dynalink.support.AbstractRelinkableCallSite
jdk.dynalink.support.ChainedCallSite
- 所有已实现的接口:
-
RelinkableCallSite
实现多态内联缓存策略的可重链接调用站点。它记住了最多8个
GuardedInvocation
,并在每次重新链接请求时构建一个方法句柄级联链,其中一个调用会回退到下一个调用。可以通过在子类中覆盖getMaxChainLength()
来自定义记忆的调用次数。当此调用站点与新调用重新链接且链的长度已达到最大值时,它将丢弃最旧的调用。已失效的开关点和由其失效的异常触发的调用会立即从链中移除。调用永远不会重新排序;最近链接的方法句柄始终位于链的开头,最近链接的方法句柄位于链的末尾。调用站点可以安全地在多个线程上同时重新链接。链接中的竞争条件通过丢弃在失败线程上生成的GuardedInvocation
来解决,而不将其合并到链中,因此可能会导致对相同参数重复链接。
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected int
链中方法句柄的最大数量。void
relink
(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke) 每次重新链接调用站点时,动态链接器都会调用此方法(但请参阅RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)
以获取异常)。void
resetAndRelink
(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke) 每次重新链接调用站点时,动态链接器都会调用此方法,并且链接器希望调用站点丢弃任何先前的链接状态(这与RelinkableCallSite.relink(GuardedInvocation, MethodHandle)
的区别)。Methods declared in class jdk.dynalink.support.AbstractRelinkableCallSite
getDescriptor, initialize
Methods declared in class java.lang.invoke.MutableCallSite
dynamicInvoker, getTarget, setTarget, syncAll
-
Constructor Details
-
ChainedCallSite
创建一个新的链式调用站点。- 参数:
-
descriptor
- 调用站点的描述符。
-
-
Method Details
-
getMaxChainLength
protected int getMaxChainLength()链中方法句柄的最大数量。默认为8。如果需要更改该值,可以在子类中进行覆盖。- 返回:
-
链中方法句柄的最大数量。检查返回值,如果您的覆盖返回值小于1,则会抛出一个
RuntimeException
。
-
relink
从接口复制的描述:RelinkableCallSite
每次重新链接调用站点时,动态链接器都会调用此方法(但请参阅RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)
以获取异常)。它将传递一个GuardedInvocation
,调用站点应将其合并到其目标方法句柄中。调用此方法时,允许调用站点保留其他未失效的调用以实现多态内联缓存,并将它们与此调用组合以形成最终目标。- 参数:
-
guardedInvocation
- 调用站点应将其合并到其目标方法句柄中的受保护调用。 -
relinkAndInvoke
- 一个重新链接和调用方法句柄。这是一个与调用站点的方法类型匹配的方法句柄,由DynamicLinker
作为回调提供。当调用此方法时,它应该作为无法使用传递的参数调用其目标时的最终回退使用。回退方法是这样的,当调用它时,它将尝试为调用获取一个足够的目标GuardedInvocation
,然后调用RelinkableCallSite.relink(GuardedInvocation, MethodHandle)
或RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)
,最后调用目标。
-
resetAndRelink
从接口复制的描述:RelinkableCallSite
每次重新链接调用站点时,动态链接器都会调用此方法,并且链接器希望调用站点丢弃任何先前的链接状态(这与RelinkableCallSite.relink(GuardedInvocation, MethodHandle)
的区别)。它将传递一个GuardedInvocation
,调用站点应使用它来构建其新的目标方法句柄。调用此方法时,不建议调用站点保留任何先前的状态,应该只链接当前调用。- 参数:
-
guardedInvocation
- 调用站点应使用它来构建其目标方法句柄的受保护调用。 -
relinkAndInvoke
- 一个重新链接和调用方法句柄。这是一个与调用站点的方法类型匹配的方法句柄,由DynamicLinker
作为回调提供。当调用此方法时,它应该作为无法使用传递的参数调用其目标时的最终回退使用。回退方法是这样的,当调用它时,它将尝试为调用获取一个足够的目标GuardedInvocation
,然后调用RelinkableCallSite.relink(GuardedInvocation, MethodHandle)
或RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)
,最后调用目标。
-