Java - 获取从方法引用的属性名称

时间:2015-08-22 19:57:42

标签: java serialization reflection field bytecode

所以,我有这个课程:

public class Book {
private int id;
private String name;
private Something somebody;

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Book book = (Book) o;

    if (id != book.id && somebody.getId() != book.somebody.getId()) return false;

    return true;
}

@Override
public int hashCode() {
    return id;
}
}

我想在equals方法中获取此类中使用的所有属性 - 在这种情况下,我会从Book获得“id”(因为name不用于equals方法),我也会得到“somebody.id” “因为这也在equals方法中用作子对象。

我需要这个信息,所以我只能序列化这个属性,然后在另一台机器上反序列化时只使用它来比较equals。否则,将equals的完整对象进行比较会非常麻烦(如果我有太多的子属性)。

1 个答案:

答案 0 :(得分:0)

如果您使用的是Eclipse IDE,我知道它有equalshashcode的自动完成选项,它们将生成包括所有声明字段比较的代码。我不确定Netbeans或其他IDE是否具有类似的功能,但如果常用的IDE没有这样做会很惊讶。

此外,您的equals方法不应该比较其他对象的字段,而是在其上调用equals

public boolean equals(Object o) {
   if (this == o) return true;
   if (!(o instanceof Book)) return false; // instanceof is fast these days

   Book book = (Book) o;
   if (id == book.id &&
       // either ensure these are not null or use java.util.Objects.equals()
       somebody.equals(book.somebody))
      return true;

   return false;
}

此外,如果您的哈希码仅使用id,那么也许您的equals也可以。如果你的对象是不可变的,那么id就是你需要的所有比较,而且效率会更高一些。如果不是这种情况,那么equals中使用的检查通常会反映在hashcode中,以帮助防止哈希冲突。