我有一个包含许多私有字段的班级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
功能放入实用程序类中的静态方法中?
答案 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);
}
}