我的要求是比较两个相同未知/泛型类型的对象。 对象很复杂。它们可以包含列表,这些列表本身可以包含列表。
所以,我最初的想法是使用比较器来比较对象,反射 用于发现bean的所有属性以及用于处理任何嵌套的一些递归 列出可能包含的对象。
或者,是否有一个实用程序可以在java中完成所有这些操作?
答案 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)
我会像你刚才提到的那样做。
答案 3 :(得分:0)
母羊。我想你可以使用Reflection来获取字段列表,然后从那里开始。您需要一些复杂的代码来确定给定字段是简单类型还是复杂类型,并在比较时挖掘复杂的字段。
See this让您开始获取字段,名称和类型列表
答案 4 :(得分:0)
免责声明:我不是JAVA开发者。
我认为没有比较未知类型的简洁方法。这就是我要做的:声明一个接口,让我们称它为ComparableInterface
interface ComparableInterface {
function isEqual(ComparableInterface $a);
}
使您的未知对象可以成为实现此接口的实例的所有类。然后用它来比较它们。
我能想到的任何其他解决方案都是丑陋的黑客:/。另外我想如果你不得不比较thinkg你不知道,你的设计就有问题。
答案 5 :(得分:0)
我目前正在研究类似的问题。我可以确认使用java反射你可以比较同一个未知/泛型类型的两个对象。我发现了我需要做的所有事情here。以下是关于如何做到这一点的简要说明:
field.get(ob1).equals(field.get(ob2)
然而,比较对象内部的对象要困难得多。我没有找到它的解决方案,这就是问题:要与使用反射的项目进行比较,您需要两个对象。我还没有发现一种从未知类型的对象中提取对象的方法。如果你发现了什么,请告诉我。