Как заставить 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;
}
Ответы
Ответ 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 для недопустимых, поэтому вы можете обработать его изящно.