1

我的要求是比较相同未知/通用类型的两个对象。对象很复杂。它们可以包含列表,而列表本身可以包含列表。

因此,我最初的想法是使用 Comparator 来比较对象,使用反射来发现 bean 的所有属性,并使用递归来处理对象可能包含的任何嵌套列表。

或者,是否有一个实用程序可以在 java 中为我完成所有这些工作?

4

6 回答 6

1

您可以使用Bean Utils或直接使用... Apache Commons EqualsBuilder

类似的解决方案

编辑: 请看看这篇文章。谷歌搜索后,我还发现了这个 BeanDiff api,它可能对你有用。

于 2012-04-26T12:21:46.923 回答
1

如果您可以确保所有嵌套对象树实现 Comparable 您可以使用:

 public int compareTo(Object o) {
   return CompareToBuilder.reflectionCompare(this, o);
 }

http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html

于 2012-04-26T12:25:11.333 回答
0

我会按照你已经提到的那样做。

  1. 检查两个对象是否属于同一类型并且
  2. 遍历对象 1 的所有变量
    1. 获取对象 2 中变量的值
    2. 调用 valueOfVariableInObject1.compareTo(valueOfVariableInObject2)
于 2012-04-26T12:15:07.357 回答
0

母羊。我想您可以使用反射来获取字段列表,然后从那里开始。您将需要一些复杂的代码来确定给定字段是简单类型还是复杂类型,并在比较时深入了解复杂的字段。

请参阅此内容以帮助您开始获取字段列表、它们的名称和类型

于 2012-04-26T12:20:19.623 回答
0

免责声明:我不是 JAVA 开发人员。

我认为没有一种比较未知类型的干净方法。这就是我要做的:声明一个接口,我们称之为 ComparableInterface

interface ComparableInterface {
    function isEqual(ComparableInterface $a);
}

使您的未知对象可能成为实例的所有类都实现此接口。然后用它来比较它们。

我能想到的任何其他解决方案都将是一个丑陋的黑客:/。另外我认为,如果您必须比较您不知道的想法,那么您的设计就有问题。

于 2012-04-26T12:22:00.380 回答
0

我目前正在研究类似的问题。我可以确认使用 java 反射可以比较相同未知/通用类型的两个对象。我在这里找到了我需要做的一切。以下是有关如何执行此操作的一些简要说明:

  1. 在一个函数中获取两个对象
  2. 确定 ob1 的所有字段
  3. 假设对象的类型相同,您可以使用 one 字段从两个对象中获取值并进行比较,如下所示field.get(ob1).equals(field.get(ob2)

但是,比较对象内部的对象要困难得多。我还没有找到解决方案,这就是问题所在:要与使用反射的项目进行比较,您需要两个对象。我还没有找到一种从未知类型的对象中提取对象的方法。如果你发现什么,请告诉我。

于 2013-05-03T14:43:49.367 回答