我想比较两个Java对象而不覆盖equals方法。因为我需要在我拥有的n个类中重写equals方法,所以我需要一个通用的实用方法来比较两个Java对象。
喜欢:
A a1,a2;
B b1,b2;
C c1,c2;
-----
-----
boolean isEqual1 = new ObjectComparator().isEquals(a1 , a2);
boolean isEqual2 = new ObjectComparator().isEquals(b1 , b2);
boolean isEqual3 = new ObjectComparator().isEquals(c1 , c2);
请帮我编写一个用于比较任何Java对象的通用实用程序
希望通过使用Field
类和getClass
方法,我们可以实现它。请指导我。
答案 0 :(得分:10)
查看Apache Commons库中的EqualsBuilder.reflectionEquals
。
此方法使用反射确定两个对象是否相等。
它使用
AccessibleObject.setAccessible
来访问私有字段。这意味着如果未正确设置权限,则在安全管理器下运行时将抛出安全性异常。它也没有明确测试那么高效。
因此,在您的示例中,它看起来像:
A a1,a2;
B b1,b2;
C c1,c2;
-----
-----
boolean isEqual1 = EqualsBuilder.reflectionEquals(a1 , a2);
boolean isEqual2 = EqualsBuilder.reflectionEquals(b1 , b2);
boolean isEqual3 = EqualsBuilder.reflectionEquals(c1 , c2);
答案 1 :(得分:3)
这可能是您正在寻找的EqualsBuilder.reflectionEquals
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
答案 2 :(得分:2)
尝试使用Apache Commons EqualsBuilder#reflectionEquals方法并检查它是否符合您的需求。
答案 3 :(得分:1)
首先,您是否有一个令人信服的理由不想使用equals方法? equals方法由集合类在内部使用,因此您必须遵守equals合同。
如果有,那么是的,您可以使用反射进行字段比较。 获取班级的list of fields和每个字段check the value。您还必须确保它们都是同一类的实例。
答案 4 :(得分:0)
您希望{1.7}在Objects.equals(a,b)
包
java.util
如果您使用的是早于Java 1.7的版本,则可以使用其他人建议的其中一个库,最明显的是Apache Commons项目。
答案 5 :(得分:0)
您可能需要考虑使用Shazamcrest。
从他们的github页面:
拥有具有以下结构的
Person
bean:Person person |-- String name |-- String surname |-- Address address |-- String streetName |-- int streetNumber |-- String postcode
将两个
Person
bean与Shazamcrest进行比较,我们会写:assertThat(actualPerson, sameBeanAs(expectedPerson));
答案 6 :(得分:0)
试试这个。如果您比较的对象很大,这可以很好地工作但需要更多的堆空间。 org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals(obj1,obj2)
你可以从下面拿到罐子。
<!-- https://mvnrepository.com/artifact/org.unitils/unitils -->
<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils</artifactId>
<version>2.2</version>
</dependency>