如何让Java反映在超级课程中的现场字段?不仅仅是实际的课程[英] How to get Java reflect to spot fields in the super class? not just the actual class

问题描述

我最近改变了我的架构一点,所以我的类继承了超级类,问题是我的比较方法,它使用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;
    }

推荐答案

您可以使用this.getClass().getSuperClass()直到此getSuperClass()方法返回null以获取父字段.

所以,最好的是你为代码分解.实现一个方法,将Field列表为参数,并在其中执行您的逻辑部分,以及通过while(superClass != null)循环搜索字段的主要方法.

其他推荐答案

虽然已经很晚了,我正在添加我的建议,因为这是一个很好的解决方案.

Spring Framework提供了一个漂亮的Util类 org.springframework.util.ReflectionUtils此类具有我们可以使用的几种方法. 从ObjectClass和IS使用的超类获取属性的字段实例ReflectionUtils.findField(clazz, fieldName);


util的好处是它不会抛出异常.相反,它返回无效的NULL,因此您可以优雅地处理它.

其他推荐答案

apache commons lang提供了一个方法 fieldutils.getallfields(),它是@ sp00m算法的实现.

本文地址:https://www.itbaoku.cn/post/978716.html