问题标签 [methodhandle]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
116 浏览

java - MethodHandle 中的局部变量

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

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

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

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

0 投票
2 回答
434 浏览

java - 如何使用可变参数调用 MethodHandle

我正在尝试用 MethodHandle 替换反射调用,但 varargs 似乎无法处理。

我的反射调用程序目前看起来像这样:

我目前重写它的尝试看起来像这样(Invoker暴露的接口必须保持不变):

这在大多数情况下都很好用。但是可变参数打破了一切。例如有一个方法,如:

和这样的论点:

并且execute如上所述实施将失败。asSpreader()我尝试了, MethodHandles.explicitCastArguments(),invoke而不是etc的各种组合,invokeWithArguments但没有成功。

我可以调用可变参数方法的唯一方法是提供内联参数而不是数组。例如

但我不能这样做并保持Invoker它目前具有的通用性。

这真的不可能按照我尝试的方式进行吗?

更新: 在对各种场景进行基准测试后,我决定坚持使用反射,因为在所有测试用例invokeWithArguments中的表现都要差得多。

0 投票
2 回答
150 浏览

clojure - 在 clojure 中使用 java.lang.invoke.MethodHandle

我在这里学习教程:https ://www.baeldung.com/java-method-handles

在clojure中,我有一个简单的例子:

这给出了一个错误:

有没有办法开始invoke工作?

0 投票
2 回答
1165 浏览

java - 具有泛型类型的具体实现的 LambdaMetaFactory

我正在尝试使用 JavaLambdaMetaFactory来动态实现通用 lambda Handler<RoutingContext>,:

这是我的尝试LambdaMetaFactory

这给出了错误:

functionMethodType我已经为and尝试了一系列其他选项implementationMethodHandle,但还没有设法让它工作。此外,即使我将RoutingContext.class引用替换为Object.class,这也不能修复错误。

我可以使lambda.handle(ctx)调用成功的唯一方法是通过更改HomeHandler使其不扩展Handler,使其成为HomeHandler::handle静态并更改RoutingContext.classObject.class. 奇怪的是,我仍然可以将生成的 lambda 转换为Handler<RoutingContext>,即使它不再扩展Handler

我的问题:

  1. 如何LambdaMetaFactory使用非静态方法?

  2. 对于这个非静态 SAM 类HomeHandler,它如何在后台使用实例分配?是否LambdaMetaFactory创建接口实现的单个实例,无论有多少方法调用,因为在此示例中没有捕获的变量?或者它是否为每个方法调用创建一个新实例?还是我应该创建一个实例并以某种方式将其传递给 API?

  3. 如何LambdaMetaFactory使用泛型方法?

编辑:除了下面的好答案之外,我还看到了这篇博客文章,解释了所涉及的机制:

https://medium.freecodecamp.org/a-faster-alternative-to-java-reflection-db6b1e48c33e

0 投票
0 回答
42 浏览

java - MethodHandle 比 Reflection 慢?

我已经运行了一个简单的测试。

但它出现了以下结果。

为什么 MethodHandle 比 Reflection 慢得多?由于 Javadoc 说 MethodHandle 应该更快,有没有办法解决这个问题?

0 投票
1 回答
242 浏览

java - 如何链接 MethodHandle 调用?

我有一个问题,我有多个具有相同签名的方法(全部返回 void)。我希望能够将这些方法的 methodHandle 组合起来,以获得一个依次调用每个方法的 methodHandle。

我想出的唯一方法是使用guardWithTest,我有一个如何使它工作的例子:https ://gist.github.com/gregw/b6c926fb44fd9a45b2c5afccaf7dcbf4

但代码的本质是:```java

```

有没有更简单的方法来做到这一点?

补充问题......我应该这样做还是在方法句柄集合上循环调用 methodHandles 是否一样快?

0 投票
1 回答
461 浏览

java - java.lang.NoSuchMethodError: VarHandle.compareAndSet(VariableHandlesExample,State,State)void

VarHandle 显示以下错误 -

我的程序是:

0 投票
1 回答
801 浏览

java - 如何在 Java 9+ 中创建一个 varhandle 来访问数组的元素

我正在尝试转换一些使用 Unsafe 对类中的局部变量执行内存访问的代码,并且该代码似乎也使用 Unsafe 来访问数组中的元素。

我有以下代码为单个元素创建 VarHandle,它似乎可以工作。

我还读到您还可以使用 VarHandles 访问数组元素。使用上面的代码,我可以获得对整个数组的引用,但我不能完全弄清楚如何构造 VarHandle 以便我可以使用它来访问数组元素。

我看到 MethodHandle 具有arrayElementVarHandle(int[].class)返回 VarHandle 的 。也许我需要以某种方式将 VarHandle 转换回 MethodHandle 然后调用arrayElementVarHandle()它才能做到这一点?

0 投票
1 回答
448 浏览

java - 从jar中获取csv文件

我有以下代码行:

有人可以向新手解释一下:

该代码工作并访问位于 jar 中的 csv 文件。我只是不明白每种方法在做什么

我能够将这条线简化为:

但仍然很困惑。SQLUtilProd.class 做什么?getResourceAsStream 如何知道从 jar 中获取文件?如果你有多个罐子会发生什么?

不确定,但我认为我们使用 SQLUtil.class 来获取类对象,这反过来又使我们能够访问 getResourceAsStream 用来定位文件的类加载器。

如果这是真的,classLoader 在哪里定义包含 jar 的路径?

0 投票
0 回答
391 浏览

java - 查找私人课程

我正在为 Web 应用程序从 Java 7 (yipes) 迁移到 Java 11,但由于非法反射访问警告而在迁移某些代码时遇到了困难(它不会阻止事情的工作,但他们是否真的应该在未来的 JDK 更新中执行他们的威胁,我希望我的代码准备好)。

我正在尝试从 WindowsPreferences 类(这是 11.0.2 JDK 附带的 java.util.prefs 包中的私有类)调用注册表方法。

我以前有代码可以在我的实用程序类的构造函数中初始化方法,如下所示:

然后我可以稍后像这样调用它们:

这对于 Java 7 非常有效,但在 Java 11 中我不得不重新调整一些东西。

我现在拥有的是:

这工作得很好,我可以很好地从注册表中读取,但是每当我从私人课程中调用.setAccessible(true)a时,我都会得到Method

警告:发生非法反射访问操作
警告:com.admin.utils.RegistryManager (file://WebRoot/WEB-INF/classes/) 对方法 java.util.prefs.WindowsPreferences.closeKey(long)的非法反射访问
警告:请考虑将此报告给 com.admin.utils.RegistryManager 的维护者
警告:使用 --illegal-access=warn 启用对进一步非法反射访问操作的
警告 警告:所有非法访问操作将在未来版本中被拒绝

然后我尝试使用Lookup来获取MethodHandles usingunreflect但问题仍然存在,因为该类是私有的(这是针对不同的方法,但基本原理相同):

我仍然收到警告,systemRegCloseKeyDeclaredMethod.setAccessible(true);但如果我将其注释掉,则会出现运行时异常:

java.lang.IllegalAccessException:类不公开:java.util.prefs.WindowsPreferences.closeKey[Ljava.lang.Object;@4c6e276e/invokeVirtual,来自 com.admin.utils.RegistryManager(未命名模块 @6ee52dcd)

我应该怎么做才能正确反映私人课程(或者这实际上是我不应该做的事情)?