Java:孙子类属性的反思

问题描述 投票:0回答:1

我在尝试使用 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 子类需要使用此方法。

感谢您的帮助:>

java inheritance reflection
1个回答
0
投票

正如您所提到的,将 toFileFormat 方法移至 User 类(或任何其他子类)是一个很好的解决方案。这允许每个子类实现自己的将对象转换为 JSON 的行为,同时避免访问私有字段的问题。如果子类之间需要共享公共代码,您可以在超类中创建子类可以调用的辅助方法(例如,PermanentObject)。

您还可以为要包含在 JSON 表示中的字段提供公共 getter 方法,而不是通过反射直接访问字段。这样,您就可以在不违反封装的情况下访问这些值。

© www.soinside.com 2019 - 2024. All rights reserved.