我的要求是比较相同未知/通用类型的两个对象。对象很复杂。它们可以包含列表,而列表本身可以包含列表。
因此,我最初的想法是使用 Comparator 来比较对象,使用反射来发现 bean 的所有属性,并使用递归来处理对象可能包含的任何嵌套列表。
或者,是否有一个实用程序可以在 java 中为我完成所有这些工作?
我的要求是比较相同未知/通用类型的两个对象。对象很复杂。它们可以包含列表,而列表本身可以包含列表。
因此,我最初的想法是使用 Comparator 来比较对象,使用反射来发现 bean 的所有属性,并使用递归来处理对象可能包含的任何嵌套列表。
或者,是否有一个实用程序可以在 java 中为我完成所有这些工作?
您可以使用Bean Utils或直接使用... Apache Commons EqualsBuilder
类似的解决方案
编辑: 请看看这篇文章。谷歌搜索后,我还发现了这个 BeanDiff api,它可能对你有用。
如果您可以确保所有嵌套对象树实现 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
我会按照你已经提到的那样做。
母羊。我想您可以使用反射来获取字段列表,然后从那里开始。您将需要一些复杂的代码来确定给定字段是简单类型还是复杂类型,并在比较时深入了解复杂的字段。
请参阅此内容以帮助您开始获取字段列表、它们的名称和类型
免责声明:我不是 JAVA 开发人员。
我认为没有一种比较未知类型的干净方法。这就是我要做的:声明一个接口,我们称之为 ComparableInterface
interface ComparableInterface {
function isEqual(ComparableInterface $a);
}
使您的未知对象可能成为实例的所有类都实现此接口。然后用它来比较它们。
我能想到的任何其他解决方案都将是一个丑陋的黑客:/。另外我认为,如果您必须比较您不知道的想法,那么您的设计就有问题。
我目前正在研究类似的问题。我可以确认使用 java 反射可以比较相同未知/通用类型的两个对象。我在这里找到了我需要做的一切。以下是有关如何执行此操作的一些简要说明:
field.get(ob1).equals(field.get(ob2)
但是,比较对象内部的对象要困难得多。我还没有找到解决方案,这就是问题所在:要与使用反射的项目进行比较,您需要两个对象。我还没有找到一种从未知类型的对象中提取对象的方法。如果你发现什么,请告诉我。