MethodHandle 中的局部变量
Local variables in MethodHandle
java.lang.invoke.MethodHandle
和朋友允许通过一系列 combinators.
生成符合 JIT 条件的运行时代码
如何在 MethodHandles 中创建 局部变量 ?理想情况下,我想要的方法签名看起来像
MethodHandle withLocalVariable(
Class<?> varClazz, Function<VarHandle, MethodHandle> usingVar)
尽管我不确定 VarHandle
是否真的是正确的抽象。
请注意,仅仅创建一个 holder 变量还不够好——我希望 MethodHandle
的不同调用使用不同的变量。
您不能创建局部变量。如果你想多次使用一个值,你可以使用 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
其中传递的参数既用作副作用句柄的参数又用作 return 值。本质上,您可以多次使用该值。
但是当涉及到方法句柄时,确实没有简单的一刀切的答案。或许我能给出的最好建议是尽量不要使用它们。即用您需要的代码编写静态方法,然后在更长的方法句柄链中使用方法句柄。
java.lang.invoke.MethodHandle
和朋友允许通过一系列 combinators.
如何在 MethodHandles 中创建 局部变量 ?理想情况下,我想要的方法签名看起来像
MethodHandle withLocalVariable(
Class<?> varClazz, Function<VarHandle, MethodHandle> usingVar)
尽管我不确定 VarHandle
是否真的是正确的抽象。
请注意,仅仅创建一个 holder 变量还不够好——我希望 MethodHandle
的不同调用使用不同的变量。
您不能创建局部变量。如果你想多次使用一个值,你可以使用 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
其中传递的参数既用作副作用句柄的参数又用作 return 值。本质上,您可以多次使用该值。
但是当涉及到方法句柄时,确实没有简单的一刀切的答案。或许我能给出的最好建议是尽量不要使用它们。即用您需要的代码编写静态方法,然后在更长的方法句柄链中使用方法句柄。