问题标签 [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.
java - MethodHandle 中的局部变量
java.lang.invoke.MethodHandle
和朋友允许通过一系列组合符生成符合 JIT 条件的运行时代码。
如何在 MethodHandles 中创建局部变量?理想情况下,我想要的方法签名看起来像
虽然我不确定VarHandle
实际上是正确的抽象。
请注意,仅创建一个持有者变量还不够好——我希望不同的调用MethodHandle
使用不同的变量。
java - 如何使用可变参数调用 MethodHandle
我正在尝试用 MethodHandle 替换反射调用,但 varargs 似乎无法处理。
我的反射调用程序目前看起来像这样:
我目前重写它的尝试看起来像这样(Invoker
暴露的接口必须保持不变):
这在大多数情况下都很好用。但是可变参数打破了一切。例如有一个方法,如:
和这样的论点:
并且execute
如上所述实施将失败。asSpreader()
我尝试了, MethodHandles.explicitCastArguments()
,invoke
而不是etc的各种组合,invokeWithArguments
但没有成功。
我可以调用可变参数方法的唯一方法是提供内联参数而不是数组。例如
但我不能这样做并保持Invoker
它目前具有的通用性。
这真的不可能按照我尝试的方式进行吗?
更新:
在对各种场景进行基准测试后,我决定坚持使用反射,因为在所有测试用例invokeWithArguments
中的表现都要差得多。
clojure - 在 clojure 中使用 java.lang.invoke.MethodHandle
我在这里学习教程:https ://www.baeldung.com/java-method-handles
在clojure中,我有一个简单的例子:
这给出了一个错误:
有没有办法开始invoke
工作?
java - 具有泛型类型的具体实现的 LambdaMetaFactory
我正在尝试使用 JavaLambdaMetaFactory
来动态实现通用 lambda Handler<RoutingContext>
,:
这是我的尝试LambdaMetaFactory
:
这给出了错误:
functionMethodType
我已经为and尝试了一系列其他选项implementationMethodHandle
,但还没有设法让它工作。此外,即使我将RoutingContext.class
引用替换为Object.class
,这也不能修复错误。
我可以使lambda.handle(ctx)
调用成功的唯一方法是通过更改HomeHandler
使其不扩展Handler
,使其成为HomeHandler::handle
静态并更改RoutingContext.class
为Object.class
. 奇怪的是,我仍然可以将生成的 lambda 转换为Handler<RoutingContext>
,即使它不再扩展Handler
。
我的问题:
如何
LambdaMetaFactory
使用非静态方法?对于这个非静态 SAM 类
HomeHandler
,它如何在后台使用实例分配?是否LambdaMetaFactory
创建接口实现的单个实例,无论有多少方法调用,因为在此示例中没有捕获的变量?或者它是否为每个方法调用创建一个新实例?还是我应该创建一个实例并以某种方式将其传递给 API?如何
LambdaMetaFactory
使用泛型方法?
编辑:除了下面的好答案之外,我还看到了这篇博客文章,解释了所涉及的机制:
https://medium.freecodecamp.org/a-faster-alternative-to-java-reflection-db6b1e48c33e
java - MethodHandle 比 Reflection 慢?
我已经运行了一个简单的测试。
但它出现了以下结果。
为什么 MethodHandle 比 Reflection 慢得多?由于 Javadoc 说 MethodHandle 应该更快,有没有办法解决这个问题?
java - 如何链接 MethodHandle 调用?
我有一个问题,我有多个具有相同签名的方法(全部返回 void)。我希望能够将这些方法的 methodHandle 组合起来,以获得一个依次调用每个方法的 methodHandle。
我想出的唯一方法是使用guardWithTest,我有一个如何使它工作的例子:https ://gist.github.com/gregw/b6c926fb44fd9a45b2c5afccaf7dcbf4
但代码的本质是:```java
```
有没有更简单的方法来做到这一点?
补充问题......我应该这样做还是在方法句柄集合上循环调用 methodHandles 是否一样快?
java - java.lang.NoSuchMethodError: VarHandle.compareAndSet(VariableHandlesExample,State,State)void
VarHandle 显示以下错误 -
我的程序是:
java - 如何在 Java 9+ 中创建一个 varhandle 来访问数组的元素
我正在尝试转换一些使用 Unsafe 对类中的局部变量执行内存访问的代码,并且该代码似乎也使用 Unsafe 来访问数组中的元素。
我有以下代码为单个元素创建 VarHandle,它似乎可以工作。
我还读到您还可以使用 VarHandles 访问数组元素。使用上面的代码,我可以获得对整个数组的引用,但我不能完全弄清楚如何构造 VarHandle 以便我可以使用它来访问数组元素。
我看到 MethodHandle 具有arrayElementVarHandle(int[].class)
返回 VarHandle 的 。也许我需要以某种方式将 VarHandle 转换回 MethodHandle 然后调用arrayElementVarHandle()
它才能做到这一点?
java - 从jar中获取csv文件
我有以下代码行:
有人可以向新手解释一下:
该代码工作并访问位于 jar 中的 csv 文件。我只是不明白每种方法在做什么
我能够将这条线简化为:
但仍然很困惑。SQLUtilProd.class 做什么?getResourceAsStream 如何知道从 jar 中获取文件?如果你有多个罐子会发生什么?
不确定,但我认为我们使用 SQLUtil.class 来获取类对象,这反过来又使我们能够访问 getResourceAsStream 用来定位文件的类加载器。
如果这是真的,classLoader 在哪里定义包含 jar 的路径?
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
来获取MethodHandle
s usingunreflect
但问题仍然存在,因为该类是私有的(这是针对不同的方法,但基本原理相同):
我仍然收到警告,systemRegCloseKeyDeclaredMethod.setAccessible(true);
但如果我将其注释掉,则会出现运行时异常:
java.lang.IllegalAccessException:类不公开:java.util.prefs.WindowsPreferences.closeKey[Ljava.lang.Object;@4c6e276e/invokeVirtual,来自 com.admin.utils.RegistryManager(未命名模块 @6ee52dcd)
我应该怎么做才能正确反映私人课程(或者这实际上是我不应该做的事情)?