- java.lang.Object
-
- java.lang.invoke.CallSite
-
- 已知直接子类:
-
ConstantCallSite
,MutableCallSite
,VolatileCallSite
public abstract class CallSiteextends Object
CallSite
是变量MethodHandle
的持有者 ,其名称为target
。 链接到CallSite
的invokedynamic
指令委托对站点当前目标的所有调用。CallSite
可以与若干invokedynamic
指令相关联,或者它可以是“自由浮动”,与无关联。 在任何情况下,都可以通过名为dynamic invoker的关联方法句柄调用它。CallSite
是一个抽象类,不允许用户直接子类化。 它有三个直接的,具体的子类,可以实例化或子类化。- 如果不需要一个可变的靶,
invokedynamic
指令可永久地用的手段结合constant call site 。 - 如果需要具有易失性变量语义的可变目标,因为必须立即且可靠地见证对目标的更新,可以使用volatile call site 。
- 否则,如果需要可变目标,则可以使用mutable 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));}
- 从以下版本开始:
- 1.7
-
-
方法摘要
所有方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 abstract MethodHandle
dynamicInvoker()
生成一个等效于已连接到此调用站点的invokedynamic指令的方法句柄。abstract MethodHandle
getTarget()
根据此调用站点的特定类定义的行为,返回调用站点的目标方法。abstract void
setTarget(MethodHandle newTarget)
根据此调用站点的特定类定义的行为,更新此调用站点的目标方法。MethodType
type()
返回此调用站点的目标类型。
-
-
-
方法详细信息
-
type
public MethodType type()
返回此调用站点的目标类型。 虽然目标可能会发生变化,但任何呼叫站点的类型都是永久性的,并且永远不会变为不相等的类型。setTarget
方法通过拒绝任何没有先前目标类型的新目标来强制执行此不变量。- 结果
- 当前目标的类型,也是任何未来目标的类型
-
getTarget
public abstract MethodHandle getTarget()
根据此调用站点的特定类定义的行为,返回调用站点的目标方法。CallSite
的直接子类记录了此方法的特定于类的行为。- 结果
- 调用站点的当前链接状态,其目标方法句柄
- 另请参见:
-
ConstantCallSite
,VolatileCallSite
,setTarget(java.lang.invoke.MethodHandle)
,ConstantCallSite.getTarget()
,MutableCallSite.getTarget()
,VolatileCallSite.getTarget()
-
setTarget
public abstract void setTarget(MethodHandle newTarget)
- 参数
-
newTarget
- 新目标 - 异常
-
NullPointerException
- 如果建议的新目标为空 -
WrongMethodTypeException
- 如果建议的新目标具有与先前目标不同的方法类型 - 另请参见:
-
getTarget()
,ConstantCallSite.setTarget(java.lang.invoke.MethodHandle)
,MutableCallSite.setTarget(java.lang.invoke.MethodHandle)
,VolatileCallSite.setTarget(java.lang.invoke.MethodHandle)
-
dynamicInvoker
public abstract MethodHandle dynamicInvoker()
生成一个等效于已连接到此调用站点的invokedynamic指令的方法句柄。此方法等效于以下代码:
MethodHandle getTarget, invoker, result; getTarget = MethodHandles.publicLookup().bind(this, "getTarget", MethodType.methodType(MethodHandle.class)); invoker = MethodHandles.exactInvoker(this.type()); result = MethodHandles.foldArguments(invoker, getTarget)
- 结果
- a method handle which always invokes this call site's current target
-
-