Подтвердить что ты не робот

Как заставить Java отражать пятно полей в суперклассе? не только фактический класс

Недавно я немного изменил свою схему, чтобы мои классы наследовали от суперкласса, проблема в том, что мой метод сравнения, который генерирует журнал аудита с использованием Java-отражения, теперь перебирает только поля дочернего класса, а не суперкласс, есть ли способ получить все ПОЛЯ? или мне нужно передать его в суперкласс.....?

Вот мой метод ниже:

public static <T> String GenerateChangeLogForEntity(T old, T updated) {
        String text = "";
        try {
            Field[] fields = old.getClass().getDeclaredFields();
            if(fields != null) {
                BaseController.getLogger().info("Z1 num fields:"+fields.length);
                for (Field field : fields) {
                    if(field.isAnnotationPresent(Column.class)) {
                        String fieldName = field.getName();
                        BaseController.getLogger().info(field.getName());
                        if(field.isAnnotationPresent(Variation.class)) {
                            Variation v = field.getAnnotation(Variation.class);
                            fieldName = v.friendlyName();
                        }
                        field.setAccessible(true);
                        if(field.get(old) != null && field.get(updated) != null) {
                            if(!(field.get(old)).equals(field.get(updated))) {
                                text += "<p><span class=\"field-name\">"+fieldName+"</span> changed from: <strong>"+GetFriendlyFieldValueForChangeLog(field.get(old))+"</strong>  to: <strong>"+GetFriendlyFieldValueForChangeLog(field.get(updated)) + "</strong></p>";
                            }
                        }
                        if(field.get(old) == null && field.get(updated) != null) {
                            text += "<p><span class=\"field-name\">"+fieldName+"</span> changed from: <strong>empty</strong> to: <strong>"+GetFriendlyFieldValueForChangeLog(field.get(updated)) + "</strong></p>";
                        }
                        if(field.get(old) != null && field.get(updated) == null) {
                            text += "<p><span class=\"field-name\">"+fieldName+"</span> changed from: <strong>"+GetFriendlyFieldValueForChangeLog(field.get(updated))+"</strong> to <strong>empty</strong>" + "</p>";
                        }
                        field.setAccessible(false);
                    }
                }
            }
        } catch(IllegalAccessException e) {}
        return text;
    }
4b9b3361

Ответ 1

Вы можете использовать this.getClass().getSuperClass(), пока этот метод getSuperClass() не вернет значение null, чтобы получить родительские поля.

Итак, лучше всего, чтобы вы факторизуете свой код. Внедрите один метод, который принимает список Field как параметр и выполняет свою логическую часть внутри него, и основной метод, который ищет поля через цикл while(superClass != null).

Ответ 2

Хотя и поздно, я добавляю свое предложение, так как это приятное решение.

Spring обеспечивают хороший класс Util org.springframework.util.ReflectionUtils У этого класса есть несколько методов, которые мы можем использовать. Чтобы получить экземпляр Field из атрибута из objectClass и superClasses, я использовал ReflectionUtils.findField(clazz, fieldName);

Хорошая вещь с использованием - это не исключение. Вместо этого он возвращает null для недопустимых, поэтому вы можете обработать его изящно.