java - MethodHandle 中的局部变量

标签 java methodhandle

java.lang.invoke.MethodHandle 和 friend 允许通过一系列 combinators 生成适合 JIT 的运行时代码.

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

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

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

请注意,仅仅创建一个持有者变量还不够好——我希望对 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

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

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

关于java - MethodHandle 中的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51850859/

相关文章:

java - 当 Gradle 中的依赖项过时时发出警告

Java代码编译成常量池中的MethodHandle

java - Websphere 上的外部 javascript 字符编码

java - 什么是NullPointerException,我该如何解决?

java - Unix 上 Java 中不区分大小写的目录访问

java - LambdaMetaFactory 和私有(private)方法

java - 从B类访问A类

java - 捕获 lambda 表达式的池

Java 方法句柄;在多个位置使用参数