Вопрос по oop, java – Как заставить Java задуматься о точечных полях в суперклассе? не только фактический класс

18

Недавно я немного изменил свою схему, поэтому мои классы наследуются от суперкласса, проблема в том, что мой метод сравнения, который генерирует журнал аудита с использованием отражения 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;
    }
ваши средства это:instance.getClass().getSuperCLass().getDeclaredFields()? Sam
Спасибо MJM, спасибо всем, да, это было легко, как пирог! :) Baconbeastnz
Н.Б .: Вы, вероятно, не должны устанавливатьfield.setAccessible(false) чтобы предотвратить условия гонки в многопоточных средах ... Lukas Eder

Ваш Ответ

3   ответа
10

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

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

Good thing with util is it doesn't throw an exception. Instead it returns null for invalid ones, so you can handle it gracefully.

32

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

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

следите за методом getFilds (), в моем случае он не работает для суперкласса. Я был успешным только с getDeclaredFilds ()
1

FieldUtils.getAllFields () которая является реализацией алгоритма @ sp00m.

Похожие вопросы