首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MethodHandle中的局部变量

MethodHandle中的局部变量
EN

Stack Overflow用户
提问于 2018-08-14 23:06:35
回答 1查看 134关注 0票数 1

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

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

代码语言:javascript
复制
MethodHandle withLocalVariable(
    Class<?> varClazz, Function<VarHandle, MethodHandle> usingVar)

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-15 00:44:09

无法创建局部变量。如果您想多次使用某个值,您可以使用identity创建一个传递,然后使用permuteArguments复制该值(如果可以的话,只需使用permuteArguments ),例如:

代码语言:javascript
复制
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

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

但是,当涉及到方法句柄时,确实没有一个简单的、适合的答案。也许我能给出的最好的建议是尽量不要使用它们。也就是说,用您需要的代码编写一个静态方法,然后在一个较长的方法句柄链中使用一个方法句柄。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51850859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档