我在尝试使用 Java 反射时遇到问题。
我有一个 PermanentObject 类,它实现了将对象转换为 JSON 字符串的通用方法(语法尚未完全实现,因此请跳过它)
这是该方法的代码:
@Override
public String toFileFormat() {
String info = "";
try {
Class myClass = this.getClass();
Class mySuperclass = myClass.getSuperclass();
Field[] superclassFields = mySuperclass.getDeclaredFields();
Field[] myFields = myClass.getDeclaredFields();
info += "{\n";
for (int i = 0; i < superclassFields.length; i++) {
myFields[i].setAccessible(true);
info += "\"" + superclassFields[i].getName() + "\":\"" + superclassFields[i].get(this) + "\",\n";
}
for (int i = 0; i < myFields.length; i++) {
myFields[i].setAccessible(true);
info += "\"" + myFields[i].getName() + "\":\"" + myFields[i].get(this) + "\"";
if (i < myFields.length - 1) info += ",";
info += "\n";
}
info += "}";
} catch (Exception e) {
e.printStackTrace();
}
return info;
}
然后我有一个扩展 PermanentObject 的 User 抽象子类,以及一个扩展 User 的 Professor 子类。
当调用该方法时,我收到此错误:
java.lang.IllegalAccessException: class esercizio2.permanence.PermanentObject cannot access a member of class esercizio2.logic.users.User with modifiers "private"
我想知道这是为什么
我可以通过在 User 类中而不是在 PermanentObject 类中实现该方法来解决问题,但这会导致代码重复,因为还有其他 PermanentObject 子类需要使用此方法。
感谢您的帮助:>
正如您所提到的,将 toFileFormat 方法移至 User 类(或任何其他子类)是一个很好的解决方案。这允许每个子类实现自己的将对象转换为 JSON 的行为,同时避免访问私有字段的问题。如果子类之间需要共享公共代码,您可以在超类中创建子类可以调用的辅助方法(例如,PermanentObject)。
您还可以为要包含在 JSON 表示中的字段提供公共 getter 方法,而不是通过反射直接访问字段。这样,您就可以在不违反封装的情况下访问这些值。