【问题标题】:How to check if a class has overridden equals and hashCode如何检查一个类是否覆盖了equals和hashCode
【发布时间】:2014-02-26 12:32:35
【问题描述】:

有没有办法找出一个类是否覆盖了equals()hashCode()

【问题讨论】:

    标签: java


    【解决方案1】:

    你可以使用反射

    public static void main(String[] args) throws Exception {
        Method method = Bar.class.getMethod("hashCode" /*, new Class<?>[] {...} */); // pass parameter types as needed
        System.out.println(method);
        System.out.println(overridesMethod(method, Bar.class));
    }
    
    public static boolean overridesMethod(Method method, Class<?> clazz) {
        return clazz == method.getDeclaringClass();
    }
    
    class Bar {
        /*
         * @Override public int hashCode() { return 0; }
         */
    }
    

    如果hashCode() 被注释掉,将打印false,如果没有,则打印true

    Method#getDeclaringClass() 将为实现它的类返回Class 对象。

    注意 Class#getMethod(..) 仅适用于 public 方法。但在这种情况下,equals()hashCode() 必须是 public。该算法需要根据其他方法进行更改。

    【讨论】:

    • 重要提示:直到我查了才意识到这一点,但getMethod("hashCode") 并不仅仅返回一个名为hashCode 的方法;它返回一个名为hashCode没有参数的方法。 getMethod 采用必须匹配方法参数的Class&lt;?&gt; 参数的可变参数列表,如果没有这样的参数,它只匹配零参数的方法。这在上面的代码中并不明显,我认为它是有缺陷的(如果类声明带有参数的hashCode),直到我查到它。
    • 细化:OP 没有说明如果 A 类覆盖 equalshashCode 以及 B 类扩展 A 但不覆盖它们会发生什么。如果想要的结果仍然是true(因为它没有使用Object 默认值),请将clazz == method.getDeclaringClass() 更改为Object.class != method.getDeclaringClass()。 [但我还没有测试过。]
    • @ajb 为了您的改进,这就是这样做的方法。在这种情况下,不需要传递目标Class
    • 我无法让您的代码为 equals 工作,我得到一个 NoSuchMethodException ...还有其他方法可以测试覆盖的等于吗?
    • 它可以在 here 运行,基于这个答案,我的项目中的其他代码也遇到了同样的问题.. hashCode 工作正常。我有 java 8
    【解决方案2】:

    要检查您的类中是否声明了方法,您可以使用以下代码。

    System.out.println(C.getMethod("yourMethod").getDeclaringClass().getSimpleName());
    

    在这里您可以找到声明类的名称。

    因此,请使用子类中的代码来检查 equals 或 hasCode 方法。如果声明的类名与您想要的类相同,则匹配

    【讨论】:

    • 我更喜欢在类上使用==,而不是尝试匹配名称,以防万一有不正常幽默感的人命名嵌套或内部类Object
    猜你喜欢
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 2017-11-19
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多