如何让Java反映出超类中的字段? 不仅仅是实际的课程
我最近改变了我的模式所以我的类inheritance自超类,问题是我的比较方法生成审计日志,使用Javareflection,现在只循环子类的字段,而不是超类,是有办法获得所有FIELDS? 或者我需要把它投入超级……?
下面是我的方法:
public static 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 += ""+fieldName+" changed from: "+GetFriendlyFieldValueForChangeLog(field.get(old))+" to: "+GetFriendlyFieldValueForChangeLog(field.get(updated)) + "
"; } } if(field.get(old) == null && field.get(updated) != null) { text += ""+fieldName+" changed from: empty to: "+GetFriendlyFieldValueForChangeLog(field.get(updated)) + "
"; } if(field.get(old) != null && field.get(updated) == null) { text += ""+fieldName+" changed from: "+GetFriendlyFieldValueForChangeLog(field.get(updated))+" to empty" + "
"; } field.setAccessible(false); } } } } catch(IllegalAccessException e) {} return text; }
您可以使用this.getClass().getSuperClass()
直到此getSuperClass()
方法返回null以获取父字段。
因此,最好的是您将代码分解。 实现一个方法,将Field
列表作为参数并在其中执行逻辑部分,以及通过while(superClass != null)
循环搜索字段的main方法。
虽然已经很晚了,但我正在添加我的建议,因为这是一个很好的解决方案。
Spring框架提供了一个很好的Util类org.springframework.util.ReflectionUtils
这个类有几个我们可以使用的方法。 要从objectClass和superClasses获取属性的Field实例,我使用了ReflectionUtils.findField(clazz, fieldName);
util的好处是它不会抛出exception。 相反,它会为无效的返回null,因此您可以优雅地处理它。
Apache Commons Lang提供了一种方法FieldUtils.getAllFields() ,它是@ sp00m算法的一种实现。