有沒有辦法找出一個類是否被覆蓋equals()
和hashCode()
?如何檢查一個類是否被覆蓋equals和hashCode
7
A
回答
18
您可以使用反射
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; }
*/
}
將打印false
如果hashCode()
被註釋掉和true
如果事實並非如此。
Method#getDeclaringClass()
將返回實現它的類的Class
對象。
備註即Class#getMethod(..)
僅適用於public
方法。但在這種情況下,equals()
和hashCode()
必須是public
。該算法需要根據其他方法進行更改。
2
要檢查您的類中是否聲明瞭方法,您可以使用下面的代碼。
System.out.println(C.getMethod("yourMethod").getDeclaringClass().getSimpleName());
這裏您可以找到聲明類的名稱。
因此,請使用您的子類中的代碼檢查equals或hasCode方法。和匹配,如果申報類名相同,您所需的類
+0
我寧願使用''==在類,而不是試圖匹配的名字,以防萬一有人用幽默的名字嵌套類或內部類'Object'的一個反常的感覺。 – ajb
相關問題
- 1. 是否必須覆蓋最終類的equals()和hashCode()方法
- 2. 在groovy中動態覆蓋`equals`和`hashCode`
- 3. 如何檢查一個塊是否在樹枝中被覆蓋?
- 4. 檢查字段是否被覆蓋
- 5. 獲取未被覆蓋的equals方法使用hashCode
- 6. 儘管hashCode/equals被覆蓋,HashMap返回null
- 7. 任何覆蓋工具都允許忽略getter,setter,equals和hashcode?
- 8. 何時覆蓋hashcode和equals方法在java中
- 9. 如果我重寫.equals(),是否需要覆蓋.hashCode(),即使我不使用HashMap?
- 10. 哪個內置java類不覆蓋equals和hashcode方法?爲什麼?
- 11. IEquatable - 覆蓋equals方法 - 檢查空
- 12. Overrding equals和hashCode
- 13. Java - equals和hashcode
- 14. Map HashCode和Equals
- 15. 的HashMap與覆蓋equals和hashCode不工作
- 16. 忘記提@覆蓋,同時重新定義equals和hashCode
- 17. 爲什麼UserRole實現Serializable並覆蓋equals()和hashcode()方法
- 18. Java:如何使用反射檢查方法是否被覆蓋
- 19. equals和hashCode:是否Objects.hash方法被破壞?
- 20. 檢查web元素是否被覆蓋的單一方法
- 21. 如何覆蓋這個hashCode方法?
- 22. 是否有一個示例爲什麼Equals/GetHashCode應該在NHibernate中被覆蓋?
- 23. 如何檢查方法在類型內是否被覆蓋?反射C#
- 24. 如何檢查Groovy類是否覆蓋父母的方法
- 25. 如何測試window.print()是否被覆蓋?
- 26. AS3反射。如何找出一個方法是否被覆蓋?
- 27. 爲什麼StringBuffer/StringBuilder不覆蓋equals或hashCode?
- 28. 緩存是否被覆蓋?
- 29. 覆蓋equals方法不會被調用
- 30. @overriding的equals()和hashCode()的Java類
重要提示:我沒有意識到這一點,直到我看着它,但'getMethod(「的hashCode」)'不是簡單地返回一個名爲'hashCode方法';它返回一個名爲'hashCode' **的方法,不帶參數**。 'getMethod'採用'類>'參數的可變參數列表,該參數必須與方法的參數匹配,並且如果沒有這樣的參數,它只匹配零參數的方法。這從上面的代碼中並不明顯,我認爲它是有缺陷的(如果該類聲明瞭帶參數的'hashCode'),直到我查找它爲止。 – ajb
細化:OP沒有說如果類'A'覆蓋'equals'和'hashCode',而類'B'擴展'A'但是不覆蓋它們會發生什麼。如果期望的結果仍然是「真」(因爲它沒有使用「Object」默認值),請將clazz == method.getDeclaringClass()更改爲Object.class!= method.getDeclaringClass()。 [但我沒有測試。] – ajb
@ajb爲了您的完善,這將是實現它的方法。在這種情況下,不需要傳遞目標'Class'。 –