【问题标题】:How to compare MethodHandle instances?如何比较 MethodHandle 实例?
【发布时间】:2014-10-30 21:32:12
【问题描述】:

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

【问题讨论】:

    标签: java methodhandle


    【解决方案1】:

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

    除此之外,MethodHandles 无论如何都没有定义的相等性。它们允许调用,但不允许内省

    JVMSpec §5.4.3.5. Method Type and Method Handle Resolution:

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


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

    【讨论】:

    • 出于好奇,您能否举一个非直接MethodHandle 的示例以及它是如何构造的?
    • MethodHandles 中工厂方法返回的大部分句柄都是非直接方法句柄。简单地说,不直接针对方法、构造函数或字段而是修改另一个句柄的行为的句柄是非直接句柄。但是the constant wrapper 不修改另一个句柄(但没有特定的目标方法)也是非直接的。
    猜你喜欢
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多