比较两个通用的复杂对象java

时间:2012-04-26 12:14:06

标签: java generics reflection compare

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

所以,我最初的想法是使用比较器来比较对象,反射 用于发现bean的所有属性以及用于处理任何嵌套的一些递归 列出可能包含的对象。

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

6 个答案:

答案 0 :(得分:1)

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

类似的solution

已编辑: 请看this post。在谷歌搜索时,我还发现this BeanDiff api可能对您有用。

答案 1 :(得分: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

答案 2 :(得分:0)

我会像你刚才提到的那样做。

  1. 检查两个对象是否属于同一类型
  2. 迭代对象1的所有变量
    1. 获取对象2中变量的值
    2. 调用valueOfVariableInObject1.compareTo(valueOfVariableInObject2)

答案 3 :(得分:0)

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

See this让您开始获取字段,名称和类型列表

答案 4 :(得分:0)

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

我认为没有比较未知类型的简洁方法。这就是我要做的:声明一个接口,让我们称它为ComparableInterface

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

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

我能想到的任何其他解决方案都是丑陋的黑客:/。另外我想如果你不得不比较thinkg你不知道,你的设计就有问题。

答案 5 :(得分:0)

我目前正在研究类似的问题。我可以确认使用java反射你可以比较同一个未知/泛型类型的两个对象。我发现了我需要做的所有事情here。以下是关于如何做到这一点的简要说明:

  1. 在函数中获取两个对象
  2. 确定所有ob1的字段
  3. 假设对象的类型相同,您可以使用一个字段从两个对象中获取值并进行比较,如field.get(ob1).equals(field.get(ob2)
  4. 然而,比较对象内部的对象要困难得多。我没有找到它的解决方案,这就是问题:要与使用反射的项目进行比较,您需要两个对象。我还没有发现一种从未知类型的对象中提取对象的方法。如果你发现了什么,请告诉我。