public abstract class CallSite extends Object
CallSite
是一个变量
MethodHandle
持有人,即其
target
。一个
invokedynamic
指令链接到一个
CallSite
代表站点的当前目标的所有电话。一个
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)
CallSite
文件这个方法的类的特定行为的直接子类。
新的目标的类型必须equal to的旧目标的类型。
newTarget
-新目标
NullPointerException
如果提出的新目标是空的
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)
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.