如何获取Java反映发现的超级类领域? 不只是实际的类[复制](How to get Java

2019-06-24 09:50发布

这个问题已经在这里有一个答案:

  • 检索使用Java反射机制继承的属性名称/值 12个回答

我最近改变了我的方案了一点,所以我的课从超类继承,问题是它生成一个审计日志,使用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;
    }

Answer 1:

您可以使用this.getClass().getSuperClass()直到getSuperClass()方法返回null获取父领域。

所以,最好的是,你因式分解你的代码。 实现一个方法来获取列表Field作为参数,并在它做你的逻辑部分,并通过搜索领域的一个主要方法while(superClass != null)循环。



Answer 2:

虽然晚了,我加入了我的建议,因为它是一个很好的解决方案。

Spring框架提供了一个很好的Util类org.springframework.util.ReflectionUtils这个类有几种方法,我们可以使用。 为了从对象类和超类我使用的属性的字段实例ReflectionUtils.findField(clazz, fieldName);

与util的好东西是不会抛出异常。 相反,它返回null无效的,这样你就可以从容地处理它。



Answer 3:

Apache的百科全书郎提供了一种方法FieldUtils.getAllFields()这是@ sp00m的算法的实现。



文章来源: How to get Java reflect to spot fields in the super class? not just the actual class [duplicate]