java call类_java11教程--类CallSite用法

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));

}

生成一个等效于已连接到此调用站点的invokedynamic指令的方法句柄。

根据此调用站点的特定类定义的行为,返回调用站点的目标方法。

根据此调用站点的特定类定义的行为,更新此调用站点的目标方法。

返回此调用站点的目标类型。

返回此调用站点的目标类型。

虽然目标可能会发生变化,但任何呼叫站点的类型都是永久性的,并且永远不会变为不相等的类型。

setTarget方法通过拒绝任何没有先前目标类型的新目标来强制执行此不变量。

根据此调用站点的特定类定义的行为,返回调用站点的目标方法。

CallSite的直接子类记录了此方法的特定于类的行为。

根据此调用站点的特定类定义的行为,更新此调用站点的目标方法。

CallSite的直接子类记录了此方法的特定于类的行为。

新目标的类型必须是equal to旧目标的类型。

生成一个等效于已连接到此调用站点的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)

变量和类型

方法

描述

生成一个等效于已连接到此调用站点的invokedynamic指令的方法句柄。

根据此调用站点的特定类定义的行为,返回调用站点的目标方法。

abstract void

根据此调用站点的特定类定义的行为,更新此调用站点的目标方法。

返回此调用站点的目标类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值