我想比较两个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
方法来实现。
看看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);
这可能是你正在寻找的EqualsBuilder.reflectionEquals
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
尝试Apache Commons equalsbuilder# reflectionEquals方法并检查它是否满足您的需求。
首先,您是否有令人信服的理由不想使用equals方法?equals方法是由集合类内部使用的,所以你必须遵守equals契约。
如果有,那么是的,您可以使用反射逐个字段进行比较。获取类的字段列表,并检查每个字段的值。您还必须确保它们都是同一个类的实例。
您希望Objects.equals(a,b)
在Java 1.7中可用,在java.util
包中
如果您使用的是Java 1.7之前的版本,您可以使用其他人建议的库之一,最著名的是Apache Commons项目。
您可能需要考虑使用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));
试试这个。这可以很好地工作,但是如果比较的对象非常大,则需要更多的堆空间。org.unitils.reflectionassert.ReflectionAssert。assertReflectionEquals(其中obj1 methoda)
http://www.unitils.org/你可以从下面得到这个罐子。
<!-- https://mvnrepository.com/artifact/org.unitils/unitils -->
<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils</artifactId>
<version>2.2</version>
</dependency>