public abstract class CallSite extends Object
CallSite
是一个变量MethodHandle
的持有人,被称为它的target
。
一个invokedynamic
指令链接到CallSite
委托给该网站的当前目标的所有呼叫。
A CallSite
可以与几个invokedynamic
联,或者它可以是“自由浮动”,与无关联。
在任何情况下,它可以通过称为其dynamic invoker的关联方法句柄来调用。
CallSite
是一个抽象类,不允许用户直接进行子类化。 它有三个立即具体的子类,可以被实例化或子类化。
invokedynamic
指令可永久地用的手段结合constant call site 。 通过更改其目标可以重新链接非常数呼叫站点。 新的目标必须与之前的目标相同的type 。 因此,虽然呼叫站点可以重新链接到一系列连续的目标,但它不能改变其类型。
以下是使用呼叫站点和引导方法的示例,它们链接每个动态调用站点以打印其参数:
static void test() throws Throwable { // THE FOLLOWING LINE IS PSEUDOCODE FOR A JVM INSTRUCTION InvokeDynamic[#bootstrapDynamic].baz("baz arg", 2, 3.14); } private static void printArgs(Object... args) { System.out.println(java.util.Arrays.deepToString(args)); } private static final MethodHandle printArgs; static { MethodHandles.Lookup lookup = MethodHandles.lookup(); Class thisClass = lookup.lookupClass(); // (who am I?) printArgs = lookup.findStatic(thisClass, "printArgs", MethodType.methodType(void.class, Object[].class)); } private static CallSite bootstrapDynamic(MethodHandles.Lookup caller, String name, MethodType type) { // ignore caller and name, but match the type: return new ConstantCallSite(printArgs.asType(type)); }
Modifier and Type | Method and Description |
---|---|
abstract MethodHandle |
dynamicInvoker()
生成等效于已经链接到此调用站点的invokedynamic指令的方法句柄。
|
abstract MethodHandle |
getTarget()
根据此调用站点的特定类定义的行为,返回调用站点的目标方法。
|
abstract void |
setTarget(MethodHandle newTarget)
根据此呼叫站点的特定类定义的行为,更新此呼叫站点的目标方法。
|
MethodType |
type()
返回此呼叫站点目标的类型。
|
public MethodType type()
setTarget
方法通过拒绝任何没有上一个目标类型的新目标来强制执行此不变式。
public abstract MethodHandle getTarget()
CallSite
子类记录了此方法的类特定行为。
ConstantCallSite
, VolatileCallSite
, setTarget(java.lang.invoke.MethodHandle)
, ConstantCallSite.getTarget()
, MutableCallSite.getTarget()
, VolatileCallSite.getTarget()
public abstract void setTarget(MethodHandle newTarget)
newTarget
- 新的目标
NullPointerException
- 如果提议的新目标为null
WrongMethodTypeException
- 如果所提出的新目标具有与先前目标不同的方法类型
getTarget()
,
ConstantCallSite.setTarget(java.lang.invoke.MethodHandle)
,
MutableCallSite.setTarget(java.lang.invoke.MethodHandle)
,
VolatileCallSite.setTarget(java.lang.invoke.MethodHandle)
public abstract MethodHandle dynamicInvoker()
此方法等同于以下代码:
MethodHandle getTarget, invoker, result; getTarget = MethodHandles.publicLookup().bind(this, "getTarget", MethodType.methodType(MethodHandle.class)); invoker = MethodHandles.exactInvoker(this.type()); result = MethodHandles.foldArguments(invoker, getTarget)