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

时间:2011-09-07 12:43:51

标签: 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方法,我们可以实现它。请指导我。

7 个答案:

答案 0 :(得分:10)

查看Apache Commons库中的EqualsBuilder.reflectionEquals

来自documentation

  

此方法使用反射确定两个对象是否相等

     

它使用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)

http://www.unitils.org/

你可以从下面拿到罐子。

<!-- https://mvnrepository.com/artifact/org.unitils/unitils -->
      <dependency>
          <groupId>org.unitils</groupId>
          <artifactId>unitils</artifactId>
          <version>2.2</version>
      </dependency>