sirve settitle que para java oop reflection audit

java - settitle - jlabel html



¿Cómo hacer que Java se refleje para detectar campos en la súper clase? no solo la clase real (3)

Recientemente he cambiado un poco mi esquema, por lo que mis clases heredan de una superclase, el problema es que mi método de comparación que genera un registro de auditoría, utilizando Java reflect, ahora solo está recorriendo los campos de la clase secundaria, no la superclase, es ¿Hay alguna manera de conseguir todos los campos? ¿O necesito lanzarlo en la súper clase ...?

Aquí está mi método a continuación:

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



Aunque es tarde, estoy agregando mi sugerencia ya que es una buena solución.

El marco de Spring proporciona una buena clase de utilidad org.springframework.util.ReflectionUtils esta clase tiene varios métodos que podemos usar. Para obtener una instancia de campo de un atributo de objectClass y superClasses utilicé ReflectionUtils.findField(clazz, fieldName);

Lo bueno de util es que no lanza una excepción. En su lugar, devuelve un valor nulo a los inválidos, por lo que puede manejarlo con gracia.


Puede usar this.getClass().getSuperClass() hasta que este método getSuperClass() devuelva null para obtener los campos primarios.

Entonces, lo mejor sería que factorizas tu código. Implemente un método que tome una lista de Field como parámetro y haga su parte lógica dentro de él, y un método principal que busque campos a través de un while(superClass != null) .