java比较对象:使用反射?

时间:2009-10-05 16:01:39

标签: java reflection object compare

我有一个对象本身有多个对象作为字段。我的问题是,我有两个这类对象,我想比较这两个。我知道我可以做equals,比较器等但有一种方法可以使用反射来获取对象的属性并进行比较。

例如,如果我有一个Car对象,它作为轮子对象,它有轮胎对象,它有螺栓对象。请记住以上所有对象都是单独的而不是嵌套的类。如何比较2个汽车对象?

感谢任何帮助?

由于

4 个答案:

答案 0 :(得分:17)

Apache Commons Lang有一个EqualsBuilder类,可以完成此操作(请参阅reflectionEquals()方法)

 public boolean equals(Object obj) {
   return EqualsBuilder.reflectionEquals(this, obj);
 }

EqualsBuilder还为特定字段的空安全比较提供了更明确的方法,这使得编写“正确”(即非反射)等于方法的方法不那么繁重。

答案 1 :(得分:8)

public class Car {
  private Wheels wheels;
  // other properties

  public boolean equals(Object ob) {
    if (!(ob instanceof Car)) return false;
    Car other = (Car)ob;
    // compare properties
    if (!wheels.equals(other.wheels)) return false;
    return true;
  }
}

是正确的方法。不建议通过反射进行自动比较。一方面,“状态”是比反映属性比较更通用的概念。

你可以写一些做深度反思比较的东西,但它有点遗漏了这一点。

答案 2 :(得分:2)

大多数现代IDE都具有hashcode和equals的生成器,可让您选择要考虑的属性。那些轻松击败反光对手的表现。

答案 3 :(得分:0)

这个想法很有意思,但请注意反思可能很慢。如果您需要进行大量比较,或者将对象放在进行比较的集合类中(例如HashMapHashSet等),则通过反射比较对象可能会成为性能瓶颈。