Bac*_*tnz 19 java oop reflection audit
我最近改变了我的模式所以我的类继承自超类,问题是我的比较方法生成审计日志,使用Java反射,现在只循环子类的字段,而不是超类,是有办法获得所有的FIELDS?还是我需要把它投入超级班......?
以下是我的方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
sp0*_*00m 34
您可以使用this.getClass().getSuperClass()此getSuperClass()方法返回null以获取父字段.
因此,最好的方法是将代码分解.实现一个方法,该方法获取Field作为参数的列表并在其中执行逻辑部分,以及通过while(superClass != null)循环搜索字段的main方法.
mds*_*404 10
虽然已经很晚了,但我正在添加我的建议,因为它是一个很好的解决方案.
Spring框架提供了一个很好的Util类,
org.springframework.util.ReflectionUtils这个类有几个我们可以使用的方法.要从objectClass和superClasses获取属性的Field实例,我使用了ReflectionUtils.findField(clazz, fieldName);
与util的好东西,它不会抛出异常.相反,它为无效的返回null,因此您可以优雅地处理它.