如何在Java中比较两个值?

How to compare two values in Java?

提问人:Luchian Grigore 提问时间:10/27/2011 最后编辑:Luchian Grigore 更新时间:10/27/2011 访问量:948

问:

我需要比较 Java 中的两个对象,但它们包含很多成员,有些是不可见的,而且我无权访问源代码 - 它们是来自第三方包的对象。

我需要找出它们之间有什么区别。类似于比较 C++ 中的内存块。但是我不知道如何在Java中做到这一点。

有什么帮助吗?

编辑:一些进一步的信息:我正在对两个对象进行一些操作 - 在一个对象上操作成功,在另一个对象上操作失败。但是,我无法说出有什么不同,这就是为什么我需要这种比较。我似乎无法让反思工作,成员不可见例外或像私人成员那样的 smth。

爪哇岛

评论

1赞 Lukas Eder 10/27/2011
您是否需要它进行调试(即比较一次)或在一段逻辑中?
2赞 rid 10/27/2011
不起作用?o1.equals(o2)
0赞 G_H 10/27/2011
@Radu 只有当这两个对象实现具有正确语义的相等,并且它们的成员类型也这样做时,这才有效。这就像深度克隆的比较版本......如果即使有一种成员类型也懒得覆盖等值,那么你就不走运了。
1赞 rid 10/27/2011
@G_H,当然,我知道这一点,这就是为什么这是一个问题,而不是一个答案。如果这些类是质量库的一部分,则它们应支持 .equals()
0赞 G_H 10/27/2011
@Radu 很公平。但是我们没有很多背景信息。看到他如何提到这些类是第三方的,依赖这个假设是危险的。某些成员可能是 Java SE API 中的类,它们不会覆盖 equals。

答:

1赞 herrlado 10/27/2011 #1

也许它有助于 http://commons.apache.org/beanutils/bean-collections/apidocs/org/apache/commons/beanutils/BeanComparator.html

2赞 denis.solonenko 10/27/2011 #2

看看这个问题:有没有一个 Java 反射实用程序可以对两个对象进行深度比较?

Unitils 可能对您有所帮助

1赞 Ewald 10/27/2011 #3

反思是一种可能的方法。

通过 Java Reflection,您可以访问这两个对象及其内容,无论它是否是私有的。但要小心,这可能被视为逆向工程,并且您可能会使用反射违反许可协议。