从CallSite文档中:
CallSite是一个存放变量MethodHandle的容器,该变量称为它的target。与CallSite关联的绑定到invokedynamic指令的所有调用都委托给站点的当前目标。一个CallSite可以与多个invokedynamic指令相关联,或者它可能是“自由漂浮”的,没有任何关联。无论如何,它都可以通过一个名叫动态调用器(dynamic invoker)的关联方法句柄来调用。
问题:
CallSite中的target是否能被更改?如何更改?请提供一段代码示例。
答:如何将CallSite与多个invokedynamic指令关联起来?
答:什么是“自由漂浮”的CallSite?如何创建这种实例?
答:
是的,可以使用setTarget()方法更改 CallSite 中 target 的值。
示例代码: ``` CallSite callsite = // some CallSite instance MethodHandles.Lookup lookup = // the lookup context MethodHandle mh = // new method handle to be used as the target callsite.setTarget(mh); // set the new target for the callsite instance ```
可以创建多个invokedynamic指令,每个指令都与CallSite关联。这样,每个 invokdedynamic 调用都会委托给CallSite的当前 target。
自由漂浮的 CallSite 是指未与任何invokedynamic指令相关联的CallSite实例。可以通过调用LambdaMetafactory#altMetafactory()方法并传递 null 作为关联invokedynamic命令的参数来创建自由漂浮的CallSite实例。
示例代码: ``` MethodHandles.Lookup lookup = // the lookup context MethodType invokedType = // the invoked type signature MethodHandle bootstrap = // the bootstrap method handle MethodHandle result = LambdaMetafactory.altMetafactory( lookup, "apply", MethodType.methodType(Function.class), invokedType, bootstrap, MethodType.methodType(CallSite.class) ).getTarget(); CallSite callsite = (CallSite) result.invokeExact(); // callsite is a free-floating CallSite instance ```
注意:我想知道不同的编写代码/lambda的方式,以便在程序中出现这3个点。
LambdaMetaFactory
会生成一个类。该类实现了接口,并具有调用目标方法的方法。 - Holger