Java MethodHandle中的局部变量

Java MethodHandle中的局部变量,java,methodhandle,Java,Methodhandle,java.lang.invoke.MethodHandle和friends允许通过一系列操作生成符合JIT条件的运行时代码 如何在MethodHandles中创建局部变量?理想情况下,我想要的方法签名如下 MethodHandle withLocalVariable( Class<?> varClazz, Function<VarHandle, MethodHandle> usingVar) methodhandlewithlocalvariable( 类var

java.lang.invoke.MethodHandle
和friends允许通过一系列操作生成符合JIT条件的运行时代码

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

MethodHandle withLocalVariable(
    Class<?> varClazz, Function<VarHandle, MethodHandle> usingVar)
methodhandlewithlocalvariable(
类varClazz,函数usingVar)
虽然我不确定
VarHandle
实际上是正确的抽象


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

您不能创建局部变量。如果要多次使用某个值,可以使用
标识创建一个传递,然后使用
permuteArguments
复制该值(如果可以的话,也可以单独使用
permuteArguments
),例如:

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


但在方法句柄方面,并没有一个简单的一刀切的答案。也许我能给出的最好建议就是尽量不要使用它们。i、 e.用您需要的代码编写一个静态方法,然后在较长的方法句柄链中使用一个方法句柄。

您能举个例子说明它的行为/使用方法吗?
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