【发布时间】:2014-02-26 12:32:35
【问题描述】:
有没有办法找出一个类是否覆盖了equals() 和hashCode()?
【问题讨论】:
标签: java
有没有办法找出一个类是否覆盖了equals() 和hashCode()?
【问题讨论】:
标签: java
你可以使用反射
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<?> 参数的可变参数列表,如果没有这样的参数,它只匹配零参数的方法。这在上面的代码中并不明显,我认为它是有缺陷的(如果类声明带有参数的hashCode),直到我查到它。
A 类覆盖 equals 和 hashCode 以及 B 类扩展 A 但不覆盖它们会发生什么。如果想要的结果仍然是true(因为它没有使用Object 默认值),请将clazz == method.getDeclaringClass() 更改为Object.class != method.getDeclaringClass()。 [但我还没有测试过。]
Class。
equals 工作,我得到一个 NoSuchMethodException ...还有其他方法可以测试覆盖的等于吗?
要检查您的类中是否声明了方法,您可以使用以下代码。
System.out.println(C.getMethod("yourMethod").getDeclaringClass().getSimpleName());
在这里您可以找到声明类的名称。
因此,请使用子类中的代码来检查 equals 或 hasCode 方法。如果声明的类名与您想要的类相同,则匹配
【讨论】:
==,而不是尝试匹配名称,以防万一有不正常幽默感的人命名嵌套或内部类Object。