gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:20:50 24 4
gpt4 key购买 nike

我有一个类 MyObject,其中包含许多私有(private)字段。 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,因为字段是私有(private)的(我不想更改)。

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

最佳答案

在尝试调用字段上的 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);
}
}

关于java - 使用反射基于静态效用函数中的所有字段等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25648783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com