问题标签 [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 - Java 7 - MethodHandles - invokeExact() 和 bindTo()
关于 MethodHandle 类的两个问题:
是否每次调用 invokeExact() 都需要对返回值进行类型转换(返回 void 或 Object 的目标方法除外)?
似乎 MethodHandle 只能绑定一次到接收器。给定一个任意的 MethodHandle 实例,有没有办法确定它是否已经被绑定,如果是,绑定到什么类型?
java - 将具有返回类型的通用 `MethodType` 表示为任何对象
让以下成为我的问题中的一个类:
我想创建一个实例,MethodType
该实例描述了一个返回“任何”对象的方法。我正在尝试以下操作:
然后尝试使用
使用上面的行,我得到一个异常:
我的观察是方法返回类型应该是完全相同的类型;即我应该String.class
在上面的语句中使用来定义MethodType
. 这个对吗?有没有办法让我可以按照我描述的方式做到这一点,最好不使用反射 API?
java - 如何提高 Field.set 的性能(可能使用 MethodHandles)?
我正在编写一些调用Field.set
和Field.get
成千上万次的代码。显然这是因为反射非常慢。
我想看看我是否可以提高使用MethodHandle
Java 7 的性能。到目前为止,这就是我所拥有的:
而不是field.set(pojo, value)
,我正在做:
但是,这似乎并不比使用反射的 Field.set 调用更好。我在这里做错了吗?
我读到使用invokeExact
可能会更快,但是当我尝试使用它时,我得到了一个java.lang.invoke.WrongMethodTypeException
.
有没有人能够成功优化对 Field.set 或 Field.get 的重复调用?
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。
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 之间有什么关系(如果有的话)?
java - 缓存 MethodHandles.lookup() 的结果?
我在MethodHandles.Lookup
经常使用课程的情况下工作。在这种情况下,保持MethodHandles.lookup()
多次查找之间的值是否明智?(具体来说,我使用的唯一查找方法是unreflect(java.lang.reflect.Method)
。)
这会加快速度,还是无关紧要?或者,它真的会因为某种原因减慢速度吗?
java - 结合 MethodHandles.publicLookup() 与 Method.setAccessible(true)
我知道这publicLookup()
比lookup()
公共方法更快,我想利用它。如果我要使用MethodHandles.publicLookup().unreflect(Method)
一个Method
本质上不是公开但我呼吁setAccessible(true)
过的东西,它会起作用吗?
java - 如何比较 MethodHandle 实例?
如何比较两个MethodHandle
实例?如果句柄指向相同的方法,我希望该函数返回 true。它看起来不像类覆盖equals()
或hashcode()
. 使用相等运算符 ( ==
) 是否安全?
java - 是否可以将方法引用转换为 MethodHandle?
是否可以将方法引用(例如SomeClass::someMethod
)转换为MethodHandle
实例?我想要编译时检查的好处(确保类和方法存在)以及使用MethodHandle
API 内省方法的能力。
用例:当且仅当请求不是由特定方法触发时(以避免无休止的递归),我有需要执行的代码。我想要一个编译时检查来确保类/方法存在,但是运行时检查来比较调用者和方法。
回顾一下:是否可以将方法引用转换为 aMethodHandle
?
java - Java 方法句柄
}
为什么我会收到此错误?
java.lang.invoke.WrongMethodTypeException:无法将 MethodHandle(HomePresenter,ListIterator,Text)void 转换为 (ListIterator,Text)void