【问题标题】:Detecting if hashcode and/or equals have been overriden (in ANY superclass) [duplicate]检测哈希码和/或等号是否已被覆盖(在任何超类中)[重复]
【发布时间】:2017-11-11 04:03:45
【问题描述】:

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

示例

D 扩展C 扩展B 扩展A 扩展Object

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

因此我需要一个返回的方法

  • 为Afalse
  • 为Btrue
  • 为Ctrue
  • 为Dtrue

这可能吗?

或者

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

【问题讨论】:

  • @Zong 你确定吗?我从类似的答案中尝试了这种 (getMethod()) 技术,它似乎只有在该类专门覆盖它而不是超类时才有效 - 请删除标记为重复并关闭标志,除非您绝对确定
  • 是的,我非常肯定,我认为我的回答就是证明:)
  • 如果您不认为上述问题是重复的,请展示您从该方法获得的结果以及您的预期,因为尚不清楚您认为它们会有什么不同。
  • @Zong 抱歉,我的代码(在我的项目中)没有使用'getDeclaringClass()',所以我认为它只适用于当前类。现在我按照您的代码进行了修复,谢谢

标签: java


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 1970-01-01
      • 2014-05-17
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多