【问题标题】:Local variables in MethodHandleMethodHandle 中的局部变量
【发布时间】:2019-01-21 20:49:49
【问题描述】:

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

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

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

虽然我不确定 VarHandle 实际上是完全正确的抽象。

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

【问题讨论】:

  • 你能举个例子来说明它的行为/使用方式吗?

标签: java methodhandle


【解决方案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

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

但是在方法句柄方面确实没有简单的万能答案。也许我能给出的最好建议是尽量使用它们。即使用您需要的代码编写一个静态方法,然后在更长的方法句柄链中使用该方法句柄。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-04
    • 2013-10-06
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多