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

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

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

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;
    }

person williamsandonz    schedule 14.05.2012    source источник
comment
Примечание: вам, вероятно, не следует устанавливать field.setAccessible(false), чтобы предотвратить состояние гонки в многопоточных средах ...   -  person Lukas Eder    schedule 14.05.2012
comment
ваши средства: instance.getClass().getSuperCLass().getDeclaredFields()?   -  person Sam    schedule 14.05.2012
comment
Спасибо, MJM, спасибо всем, ура, что все получилось просто, как пирог! :)   -  person williamsandonz    schedule 14.05.2012


Ответы (3)


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

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

person sp00m    schedule 14.05.2012
comment
следите за методом getFilds (), в моем случае он не работает для суперкласса. У меня получилось только с getDeclaredFilds () - person Gonçalo; 13.03.2014

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

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

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

person mds404    schedule 06.12.2016

Apache Commons Lang предоставляет метод FieldUtils.getAllFields (), который является реализацией алгоритма @ sp00m.

person Václav Kužel    schedule 03.10.2018