【发布时间】:2014-10-30 21:32:12
【问题描述】:
如何比较两个 MethodHandle 实例?如果句柄指向相同的方法,我希望该函数返回 true。看起来该类不会覆盖 equals() 或 hashcode()。使用相等运算符 (==) 是否安全?
【问题讨论】:
标签: java methodhandle
如何比较两个 MethodHandle 实例?如果句柄指向相同的方法,我希望该函数返回 true。看起来该类不会覆盖 equals() 或 hashcode()。使用相等运算符 (==) 是否安全?
【问题讨论】:
标签: java methodhandle
首先,MethodHandles 不仅可以封装目标方法,还可以封装行为。例如。您可能有两个方法句柄指向同一个方法,但一个封装了非虚拟 (super. …) 调用,一个代表普通的虚拟调用。这些句柄不能相等。
除此之外,MethodHandles 无论如何都没有定义的相等性。它们允许调用,但不允许内省:
JVMSpec §5.4.3.5. Method Type and Method Handle Resolution:
Java 虚拟机的实现不需要实习方法类型或方法句柄。也就是说,对结构相同的方法类型或方法句柄的两个不同符号引用可能无法分别解析为
java.lang.invoke.MethodType或java.lang.invoke.MethodHandle的同一实例。
但是,从 Java 8 开始,有一个功能允许内省 direct MethodHandle、Lookup.revealDirect。对于此操作成功的句柄,您可以使用返回的MethodHandleInfo 中的信息来判断两个句柄是否指向同一个方法。
【讨论】:
MethodHandle 的示例以及它是如何构造的?
MethodHandles 中工厂方法返回的大部分句柄都是非直接方法句柄。简单地说,不直接针对方法、构造函数或字段而是修改另一个句柄的行为的句柄是非直接句柄。但是the constant wrapper 不修改另一个句柄(但没有特定的目标方法)也是非直接的。