比较任意两个Java对象的常用方法



我想比较两个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>

最新更新