如何比较两个MethodHandle
实例?如果句柄指向相同的方法,我期望该函数返回true。该类似乎不会覆盖equals()
或hashcode()
。使用等于运算符(==
)安全吗?
答案 0 :(得分:2)
首先,MethodHandle
不仅可以封装目标方法,还可以封装行为。例如。您可能有两个方法句柄指向同一个方法但一个封装非虚拟(super. …
)调用,另一个代表普通虚拟调用。这些句柄不能相等。
除此之外,MethodHandle
无论如何都没有明确的等式。它们是允许调用而不是内省:
JVMSpec §5.4.3.5. Method Type and Method Handle Resolution:
实习方法类型或方法句柄不需要Java虚拟机的实现。也就是说,对结构相同的方法类型或方法句柄的两个不同的符号引用可能无法分别解析为
java.lang.invoke.MethodType
或java.lang.invoke.MethodHandle
的相同实例。
但是,从Java 8开始,有一项功能可以内省直接 MethodHandle
,Lookup.revealDirect
。对于此操作成功的句柄,您可以使用返回的MethodHandleInfo
中的信息来确定两个句柄是否指向同一方法。