如何让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算法的一种实现。