问题标签 [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 回答
383 浏览

java - 调试期间调用 MethodHandle

我正在努力思考如何有效地使用 MethodHandles,让我失望的一件事是在调试期间尝试执行 MethodHandles。这是一些示例代码,说明了我的问题。

代码在正常运行时工作,但停止 IntelliJ 调试器并尝试调用 MethodHandle 会引发UnsupportedOperationException。查看 Javadocs,我可以看到 MethodHandles 不能被反射调用,但我不确定我理解为什么,或者如何在我的程序中调试 MethodHandle 调用。任何见解将不胜感激!

0 投票
1 回答
797 浏览

java - NoSuchMethodError:Android 的 MethodHandle 中没有虚拟方法调用

我正在尝试将MethodHandleAndroid 用于项目。目前,我正在将一些现有的 Java 代码转换为与 Android 兼容,但我遇到了问题。

在普通的 Java 7/8 中,以下编译并打印“Jim”:

为 Android 编译相同的代码,但在运行时抛出异常:

MethodHandle.invoke存在并使用 varargs 功能来传递任意数量的Object参数,但在运行时它会尝试查找参数类型为 arity 2Objectint.

我尝试用invoke数组参数替换调用:arrayReader.invoke(new Object[]{array, 2}),但这只会产生另一个问题:

无论如何我都不会期望这会起作用,因为调用MethodHandle产生的MethodHandles.arrayElementGetter参数有两个参数(数组和索引),但我认为值得一试。

我正在运行 API 级别 26 的 Android 模拟器。这是build.gradle文件的一部分:

有没有办法解决这个问题,或者有什么替代方法可以达到同样的效果?

0 投票
2 回答
1581 浏览

java - MethodHandle invokeExact 带有返回和参数的静态方法

线程“主”java.lang.invoke.WrongMethodTypeException 中的异常:预期 (double)double 但在 java.lang.invoke.Invokers 的 java.lang.invoke.Invokers.newWrongMethodTypeException(Invokers.java:340) 发现 (double)void .checkExactType(Invokers.java:351) 在 InvokeDynamicDemo.main(InvokeDynamicDemo.java:32)

这段代码有什么问题,我想不通。请帮忙。

0 投票
2 回答
75 浏览

java - Using MethodHandles to call a method on of class that isn't known at compile time (without reflection)

I need to call the getName() method of a Person class, without knowing the Person class as compilation time and by using a MethodHandle (instead of normal reflection).

So I'd want this code to work (this code cannot change):

Here's my method handle code, which must not use the word "Person" (this can can change to make this work):

but this fails with WrongMethodTypeException. Any suggestion how to fix that?

0 投票
2 回答
3190 浏览

java - 将 LambdaMetafactory.metafactory() 用于普通的非静态 getter

我有一个简单的Person类,getName()它返回 a String

如何在运行时LambdaMetafactory为该非静态方法创建 lambda getName()

这是我到目前为止得到的:

哪个抛出:

0 投票
2 回答
1151 浏览

java - LambdaMetafactory 访问不同 ClassLoader 上的类

我有这个工作正常的代码:

但是如果getterMethod是从不同的 ClassLoader 加载的类的方法,它会抛出:

如何将我的ClassLoader实例传递给LambdaMetafactory?

0 投票
1 回答
139 浏览

java - MethodHandle 与一般的非无效返回过滤器?

我正在尝试建立一个MethodHandle具有通用过滤器的返回值,通过使用MethodHandles.filterReturnValue()来完成工作。

我遇到的问题是我不知道(也不关心)返回类型,所以我希望只是连接 aObject myfilter(Object obj)作为MethodHandle过滤返回对象。但是,电话中显然不允许这样做MethodHandles.filterReturnValue()

这就是我希望的工作(但没有)......

似乎MethodHandles.filterReturnValue()不适合这个目的。

然后我希望我可以制作一个MethodHandle叫做 another的东西MethodHandle,但这开始变得复杂了。

例如:

我试图让我的头脑四处走动MethodHandleProxiesLamdaMetafactory但从网上找到的 javadoc 和微不足道的例子中很难理解它们。

0 投票
2 回答
855 浏览

java - 创建 BiConsumer 作为没有反射的字段设置器

我尝试在我的一个脚本中获得最大性能,而不进行重大重构。

我发现了使用反射从字段创建 BiConsumer 的方法。

反射以缓慢着称。所以我虽然可以使用方法句柄。

这已经有点快了。但是BiConsumerFunctionalInterface它可以以某种方式生成。

但是然后我得到一个我不太明白的异常

我必须以哪种方式正确生成该设置器以提高性能。(实际上没有添加setter方法)

0 投票
1 回答
51 浏览

java - Java MethodHandle api 似乎产生了不正确的类型

鉴于此代码:

产生的 NOOP_METHOD 是

为什么第一个参数在那里,当我调用它时会导致失败,比如

因为错误消息是:

这是有问题的方法:

0 投票
1 回答
204 浏览

java - 转换原始数组的通用方法

我有很多方法的旧代码,long[] toLongArray(int[] array)但是对于许多不同的原始类型配置(在两边),我只是想知道是否有可能为此制作一种通用方法 - 而不会损失性能。
首先,我使用 MethodHandles 为 int[] -> long[] 对创建了简单的方法:

它工作得很好 - 与手动循环相同的性能,所以我决定让它通用:

但这工作要慢得多,对于我的 500000 个元素的示例数组,它慢了 15 倍以上。
有趣的是,使用 Nashorn javascript 引擎制作的 CompiledScript 比这段代码快 20% 左右。(里面有简单的复制循环)

所以我想知道是否有人知道其他方法可以做到这一点?我可能不会在任何地方使用它,因为它开始变得太“hacky”了,但现在我只需要知道它是否可能 - 因为没有带有方法句柄的通用方法可以正常工作,所以为什么这个方法这么慢,并且有可能让它更快吗?