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

java - Java 7 - MethodHandles - invokeExact() 和 bindTo()

关于 MethodHandle 类的两个问题:

  1. 是否每次调用 invokeExact() 都需要对返回值进行类型转换(返回 void 或 Object 的目标方法除外)?

  2. 似乎 MethodHandle 只能绑定一次到接收器。给定一个任意的 MethodHandle 实例,有没有办法确定它是否已经被绑定,如果是,绑定到什么类型?

0 投票
3 回答
540 浏览

java - 将具有返回类型的通用 `MethodType` 表示为任何对象

让以下成为我的问题中的一个类:

我想创建一个实例,MethodType该实例描述了一个返回“任何”对象的方法。我正在尝试以下操作:

然后尝试使用

使用上面的行,我得到一个异常:

我的观察是方法返回类型应该是完全相同的类型;即我应该String.class在上面的语句中使用来定义MethodType. 这个对吗?有没有办法让我可以按照我描述的方式做到这一点,最好不使用反射 API?

0 投票
4 回答
8196 浏览

java - 如何提高 Field.set 的性能(可能使用 MethodHandles)?

我正在编写一些调用Field.setField.get成千上万次的代码。显然这是因为反射非常慢。

我想看看我是否可以提高使用MethodHandleJava 7 的性能。到目前为止,这就是我所拥有的:

而不是field.set(pojo, value),我正在做:

但是,这似乎并不比使用反射的 Field.set 调用更好。我在这里做错了吗?

我读到使用invokeExact可能会更快,但是当我尝试使用它时,我得到了一个java.lang.invoke.WrongMethodTypeException.

有没有人能够成功优化对 Field.set 或 Field.get 的重复调用?

0 投票
1 回答
1812 浏览

java - 如何使用 Object[] 数组调用 MethodHandle.invokeExact()?

Java 的 MethodHandle.invokeExact(Object...args) 采用可变长度的参数列表。但是,当我尝试传递 Object [] 数组而不是列表时,出现错误。见下文:

第二次调用 invokeExact() 产生此异常:

这可能与两年前修复的 Eclipse 中的错误有关(https://bugs.eclipse.org/bugs/show_bug.cgi?id=385404)但我不这么认为,因为当我关闭 Eclipse 时,删除 /target 目录,使用 Maven 重新编译所有内容,然后从命令行运行我得到相同的结果。

我正在使用 Eclipse Kepler SR2,一切都是最新的,以及 JDK 1.7.0_25。

0 投票
0 回答
130 浏览

java - MethodHandles.foldArguments 和 MethodHandle.asCollector 有什么关系?

MethodHandles.foldArguments的Javadoc包含以下括号注释:

(请注意,dropArguments 可用于删除组合器或目标不希望接收的任何参数。如果某些传入参数仅用于组合器,请考虑使用 asCollector 代替,因为这些参数不需要在进入目标时驻留在堆栈中。)

首先,我很困惑这是否建议用 dropArguments+asCollector 替换 foldArguments,用 asCollector 替换 foldArguments+dropArguments,用 foldArguments+asCollector 替换 foldArguments+dropArguments 等等。

其次,我不明白为什么 MethodHandles.asCollector 在这里完全相关。

  • 该注释没有说“如果您只想将参数收集到一个数组中,请使用 asCollector”,它似乎暗示 asCollector 是 foldArguments 的一般替代品(可能与 dropArguments 结合使用),但事实并非如此。

  • 关于“在进入目标时位于堆栈上”的说法似乎暗示我应该首先将任何“仅用于组合器”的参数收集到带有 asCollector 的数组中,然后再将它们发送到组合器。我不明白添加数组创建和额外的间接级别将如何帮助任何事情,特别是因为如果生成的方法句柄被内联,JVM 无论如何都会尝试优化数组创建。如果使用 dropArguments 删除了仅组合器的 args,则 JVM 应该能够证明它们没有在目标中使用。如果由于某种原因 JVM 无法证明仅组合器的 args 未在目标中使用,因此必须使它们保持活动状态,那么肯定由 asCollector 创建的数组将保持活动状态,从而使其内容也保持活动状态。他们'

  • Java 8 添加了MethodHandles.collectArguments,它以明显的方式结合了 foldArguments 和 dropArguments 来实现仅收集器的参数。Javadoc collectArguments 没有提到 asCollector 作为替代,建议使用 asCollector 的任何建议不再成立,但 foldArguments Javadoc 仍然包含令人困惑的括号注释。

MethodHandles.foldArguments 和 MethodHandle.asCollector 之间有什么关系(如果有的话)?

0 投票
1 回答
374 浏览

java - 缓存 MethodHandles.lookup() 的结果?

我在MethodHandles.Lookup经常使用课程的情况下工作。在这种情况下,保持MethodHandles.lookup()多次查找之间的值是否明智?(具体来说,我使用的唯一查找方法是unreflect(java.lang.reflect.Method)。)

这会加快速度,还是无关紧要?或者,它真的会因为某种原因减慢速度吗?

0 投票
1 回答
245 浏览

java - 结合 MethodHandles.publicLookup() 与 Method.setAccessible(true)

我知道这publicLookup()lookup()公共方法更快,我想利用它。如果我要使用MethodHandles.publicLookup().unreflect(Method)一个Method本质上不是公开但我呼吁setAccessible(true)过的东西,它会起作用吗?

0 投票
1 回答
160 浏览

java - 如何比较 MethodHandle 实例?

如何比较两个MethodHandle实例?如果句柄指向相同的方法,我希望该函数返回 true。它看起来不像类覆盖equals()hashcode(). 使用相等运算符 ( ==) 是否安全?

0 投票
1 回答
1345 浏览

java - 是否可以将方法引用转换为 MethodHandle?

是否可以将方法引用(例如SomeClass::someMethod)转换为MethodHandle实例?我想要编译时检查的好处(确保类和方法存在)以及使用MethodHandleAPI 内省方法的能力。

用例:当且仅当请求不是由特定方法触发时(以避免无休止的递归),我有需要执行的代码。我想要一个编译时检查来确保类/方法存在,但是运行时检查来比较调用者和方法。

回顾一下:是否可以将方法引用转换为 aMethodHandle

0 投票
1 回答
111 浏览

java - Java 方法句柄

}

为什么我会收到此错误?

java.lang.invoke.WrongMethodTypeException:无法将 MethodHandle(HomePresenter,ListIterator,Text)void 转换为 (ListIterator,Text)void