检测hashcode和/或equals是否被覆盖(在任何超类中)

时间:2017-11-11 04:03:45

标签: java

有没有办法检测某个类的超类是否覆盖了hashCode或equals?

例如

D延伸C延伸B延伸A延伸Object

B实现自己的哈希码并等于

因此我需要一个返回

的方法
  • for A false
  • for B true
  • for C true
  • for D true

这可能吗?

替代地

如果有一个解决方案需要A覆盖hashCode and equals而不是B,那也没关系。主要的是我知道默认的Object哈希码和等号没有被使用

2 个答案:

答案 0 :(得分:1)

我查看了How to quickly determine if a method is overridden in Java中的示例并写道:

class A extends Object {
    public boolean isHashCodeOverridden() throws Exception {
        return !this.getClass()
            .getMethod("hashCode")
            .getDeclaringClass()
            .equals(Object.class);
    }
}

class B extends A {
    public int hashCode() { return 0; }
}

class C extends B {}

class D extends C {}

然后

System.out.println(new A().isHashCodeOverridden());
System.out.println(new B().isHashCodeOverridden());
System.out.println(new C().isHashCodeOverridden());
System.out.println(new D().isHashCodeOverridden());

打印

false
true
true
true

正如所料。

试一试:https://ideone.com/StpSBt

答案 1 :(得分:0)

您可以使用反射并检查是否在类及其超类中声明了一个方法,如A.class.getDeclaredMethods(),您将知道