- java.lang.Object
-
- java.lang.invoke.CallSite
-
- java.lang.invoke.MutableCallSite
-
- jdk.dynalink.support.AbstractRelinkableCallSite
-
- jdk.dynalink.support.ChainedCallSite
-
- All Implemented Interfaces:
-
RelinkableCallSite
public class ChainedCallSite extends AbstractRelinkableCallSite
实现多态内联缓存策略的可重新链接的调用站点。 它记住多达8个GuardedInvocation
它被链接,并且每个重新链接请求构建一个回调到下一个调用的一个方法句柄的级联链。 可以通过在子类中覆盖getMaxChainLength()
来定制记忆调用的数量。 当这个调用站点重新链接一个新的调用,并且链的长度已经在最大值时,它将丢弃最旧的调用。 无效的切换点的调用和其无效异常触发的调用从链中热切地删除。 调用从不重新排序; 最近链接的方法句柄始终处于链的开头,最后连接在最后。 呼叫站点可以同时安全地重新链接多个线程。 链接中的种族条件通过丢弃在丢失的线程上生成的GuardedInvocation
而不将其并入到链中来解决,因此它可以导致相同参数的重复链接。
-
-
构造方法摘要
构造方法 Constructor 描述 ChainedCallSite(CallSiteDescriptor descriptor)
创建一个新的链接呼叫站点。
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 protected int
getMaxChainLength()
链中方法句柄的最大数量。void
relink(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke)
每次呼叫站点重新链接时,动态链接器都会调用此方法(但是有关异常,请参阅RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)
)。void
resetAndRelink(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke)
每次调用站点重新链接时,动态链接器将调用此方法 ,并且链接器希望调用站点丢弃任何先前的链接状态(即它与RelinkableCallSite.relink(GuardedInvocation, MethodHandle)
的区别 )。-
Methods inherited from class jdk.dynalink.support.AbstractRelinkableCallSite
getDescriptor, initialize
-
Methods inherited from class java.lang.invoke.MutableCallSite
dynamicInvoker, getTarget, setTarget, syncAll
-
-
-
-
构造方法详细信息
-
ChainedCallSite
public ChainedCallSite(CallSiteDescriptor descriptor)
创建一个新的链接呼叫站点。- 参数
-
descriptor
- 呼叫站点的描述符。
-
-
方法详细信息
-
getMaxChainLength
protected int getMaxChainLength()
链中方法句柄的最大数量。 默认为8.如果需要更改值,您可以在子类中覆盖它。- 结果
-
链中方法句柄的最大数量。
检查返回值,如果您的覆盖返回小于1的值,将抛出一个
RuntimeException
。
-
relink
public void relink(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke)
描述从接口RelinkableCallSite
复制每次呼叫站点重新链接时,动态链接器都会调用此方法(但是有关异常,请参阅RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)
)。 它将通过一个GuardedInvocation
,呼叫站点应该并入其目标方法句柄。 当调用此方法时,允许调用站点保持其他无效的调用,以实现多态内联缓存,并通过此调用组合它们以形成其最终目标。- 参数
-
guardedInvocation
- 呼叫站点应该合并到其目标方法句柄中的守卫调用。 -
relinkAndInvoke
- 一个重新链接和调用方法句柄。 这是一个匹配DynamicLinker
作为回调提供的呼叫站点的方法类型的方法句柄。 当该调用站点无法使用传递的参数调用其目标时,应将其用作最终的后备程序。 回退方法是这样的,当它被调用时,它将尝试为调用获得足够的目标GuardedInvocation
,然后调用RelinkableCallSite.relink(GuardedInvocation, MethodHandle)
或RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)
,最后调用目标。
-
resetAndRelink
public void resetAndRelink(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke)
说明从接口RelinkableCallSite
复制每次调用站点重新链接时,动态链接器将调用此方法,并且链接器希望调用站点丢弃任何先前的链接状态(即它与RelinkableCallSite.relink(GuardedInvocation, MethodHandle)
的区别 )。 它将通过一个GuardedInvocation
,呼叫站点应该用来构建其新的目标方法句柄。 当调用此方法时,呼叫站点不会保留任何先前的状态,并且应该仅链接当前的调用。- 参数
-
guardedInvocation
- 呼叫站点应用于构建其目标方法句柄的守卫调用。 -
relinkAndInvoke
- 一个重新链接和调用方法句柄。 这是一个匹配由DynamicLinker
作为回调提供的呼叫站点的方法类型的方法句柄。 当该调用站点无法使用传递的参数调用其目标时,应将其用作最终的后备程序。 回退方法是这样的,当它被调用时,它将尝试为调用获得足够的目标GuardedInvocation
,然后调用RelinkableCallSite.relink(GuardedInvocation, MethodHandle)
或RelinkableCallSite.resetAndRelink(GuardedInvocation, MethodHandle)
,最后调用目标。
-
-