MethodHandle中的局部变量

时间:2018-08-14 23:06:35

标签: java methodhandle

java.lang.invoke.MethodHandle和朋友允许通过一系列combinators生成符合JIT要求的运行时代码。

如何在MethodHandles中创建局部变量?理想情况下,我想要的方法签名看起来像

MethodHandle withLocalVariable(
    Class<?> varClazz, Function<VarHandle, MethodHandle> usingVar)

尽管我不确定VarHandle实际上是否是正确的抽象。

请注意,仅创建一个holder变量还不够好-我希望MethodHandle的不同调用使用不同的变量。

1 个答案:

答案 0 :(得分:1)

您无法创建局部变量。如果要多次使用一个值,则可以使用identity创建传递,然后使用permuteArguments复制该值(或者,如果可以的话,也可以单独使用permuteArguments),例如:

MethodHandle start = identity(String.class);
MethodHandle sideEffect = lookup().findVirtual(PrintStream.class, "println", methodType(void.class, String.class)).bindTo(System.out);
MethodHandle result = collectArguments(start, 0, sideEffect); // sideEffect needs to return nothing
result = permuteArguments(result, methodType(String.class, String.class), 0, 0); // copy argument

System.out.println((String) result.invokeExact("Hello")); // Hello\nHello

其中传递的参数既用作副作用句柄的参数,又用作返回值。基本上,您可以多次使用该值。

但是,对于方法句柄,确实没有一个简单的万能解决方案。也许我能给出的最佳建议是尝试并尽量不要使用它们。即使用所需代码编写静态方法,然后在更长的方法句柄链中使用该方法的句柄。