如何比较MethodHandle实例?

时间:2014-10-30 07:57:10

标签: java methodhandle

如何比较两个MethodHandle实例?如果句柄指向相同的方法,我期望该函数返回true。该类似乎不会覆盖equals()hashcode()。使用等于运算符(==)安全吗?

1 个答案:

答案 0 :(得分:2)

首先,MethodHandle不仅可以封装目标方法,还可以封装行为。例如。您可能有两个方法句柄指向同一个方法但一个封装非虚拟(super. …)调用,另一个代表普通虚拟调用。这些句柄不能相等。

除此之外,MethodHandle无论如何都没有明确的等式。它们是允许调用而不是内省

JVMSpec §5.4.3.5. Method Type and Method Handle Resolution

  

实习方法类型或方法句柄不需要Java虚拟机的实现。也就是说,对结构相同的方法类型或方法句柄的两个不同的符号引用可能无法分别解析为java.lang.invoke.MethodTypejava.lang.invoke.MethodHandle的相同实例。


但是,从Java 8开始,有一项功能可以内省直接 MethodHandleLookup.revealDirect。对于此操作成功的句柄,您可以使用返回的MethodHandleInfo中的信息来确定两个句柄是否指向同一方法。