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

比较任意两个Java对象的常用方法,java,Java,我想比较两个Java对象,而不覆盖equals方法。因为我需要覆盖我拥有的n个类中的equals方法,所以我需要一个通用的实用方法,在这里我们可以比较两个Java对象 比如: 请帮助我编写一个用于比较任何Java对象的通用实用程序 希望通过使用Fieldclass和getClass方法我们可以实现它。请指导我。看看Apache Commons库中的 从: 此方法使用反射来确定两个对象是否相等 它使用AccessibleObject.setAccessible来访问私有字段。这意味着,如果权限设置

我想比较两个Java对象,而不覆盖equals方法。因为我需要覆盖我拥有的n个类中的equals方法,所以我需要一个通用的实用方法,在这里我们可以比较两个Java对象

比如:

请帮助我编写一个用于比较任何Java对象的通用实用程序

希望通过使用
Field
class和
getClass
方法我们可以实现它。请指导我。

看看Apache Commons库中的

从:

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

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

尝试Apache Commons方法并检查它是否满足您的需要。

这可能就是您正在寻找的


首先,您不想使用equals方法有没有令人信服的原因?equals方法由集合类在内部使用,因此您必须遵守equals契约

如果有,那么是的,您可以使用反射进行逐场比较。
获取类的名称和每个字段的名称。您还必须确保它们都是同一类的实例。

您需要
对象。equals(a,b)
在Java 1.7中的
Java.util
包中提供


如果您使用的版本比java 1.7早,您可以使用其他人所建议的一个库,最明显的是Apache CAMONS项目。

您可能需要考虑使用. 从他们的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、obj2)

你可以从下面拿这个罐子

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

组织单位
统一体
2.2

[…]而不重写equals方法[…](+1表示无论如何;-)这是文档中的一个示例,您可以在不重写的情况下调用它。;)警告:根据EqualsBuilder.reflectionEquals(对象lhs、对象rhs)Javadoc,“将不测试临时成员”。因此,EqualsBuilder.reflectionEquals(新日期(2)、新日期(3))将返回true。更好地使用reflectionEquals(对象lhs、对象rhs、布尔测试瞬态)。看看这个,令人信服的原因是我的班级可能会随着更多的领域而成长。每次我也需要更新equals方法。非常感谢。这给了我一个开始。我需要自定义该类以添加某些功能,例如,向比较字段中添加渗出等。EqualBuilder类是否可以通过扩展该类帮助我实现这些功能?警告:根据EqualBuilder。reflectionEquals(对象lhs,对象rhs)Javadoc“将不测试临时成员”。因此,EqualsBuilder.reflectionEquals(新日期(2)、新日期(3))将返回true。最好使用reflectionEquals(对象lhs、对象rhs、布尔测试瞬变)。这里的意思是对象。深度等于(a,b)。equals(a,b)只使用对象的默认equals()实现,但可以处理null。警告:根据EqualsBuilder.reflectionEquals(对象lhs,对象rhs)Javadoc,“将不测试临时成员”。因此,EqualsBuilder.reflectionEquals(新日期(2)、新日期(3))将返回true。更好地使用reflectionEquals(对象lhs、对象rhs、布尔测试瞬态)。
assertThat(actualPerson, sameBeanAs(expectedPerson));
<!-- https://mvnrepository.com/artifact/org.unitils/unitils -->
      <dependency>
          <groupId>org.unitils</groupId>
          <artifactId>unitils</artifactId>
          <version>2.2</version>
      </dependency>