等于使用反射的静态效用函数中的所有字段

时间:2014-09-03 15:58:12

标签: java reflection equals

我有一个包含许多私有字段的班级MyObject。 equals方法基于所有字段并使用反射,因为我不想列出每个字段(参见Printing all variables value from a class):

public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if ( !(o instanceof MyObject) ) {
        return false;
    }

    MyObject myO = (MyObject) o;

    Field[] fields = this.getClass().getDeclaredFields();

    for (Field field : fields) {
        try {
            if ( ! Objects.equals(field.get(this), field.get(myO))) {
                return false;
            }
        }
        catch (IllegalAccessException e) {
            System.out.println(e);
        }
    }
    return true;
}

现在我想在许多类中使用此方法,而不必一直复制和粘贴此函数。因此,我在实用程序类中编写了一个静态函数

public static boolean allFieldsEqual(Object t, Object o)

并用

替换上述equals函数
public boolean equals(Object o) {
    return allFieldsEqual(this, o);
}

问题是Field.get(Object o)抛出IllegalAccessException,因为字段是私有的(我不想改变)。

您是否知道如何将allFieldsEqual功能放入实用程序类中的静态方法中?

1 个答案:

答案 0 :(得分:3)

尝试在字段上调用get()之前,请先将其设置为可访问:

for (Field field : fields) {
    boolean accessible = field.isAccessible();
    field.setAccessible(true);
    try {
        if ( ! Objects.equals(field.get(this), field.get(myO))) {
            return false;
        }
    }
    catch (IllegalAccessException e) {
        System.out.println(e);
    } finally {
        field.setAccessible(accessible);
    }
}