我正在尝试编写一个用于接收大型对象的类,并确保仅更改了某些字段,通常您会以这种方式注释/添加验证,但是不幸的是,在这种情况下,这不是一种选择,我唯一能做的change是我正在研究的一类,它将收到我应该以某种方式验证的非常大(且非常嵌套!)的对象。

我最初的想法是制作一个可以更改的事物的“列表”,然后遍历该对象中的所有属性,并检查是否有不属于“白名单”的任何更新,我拥有该对象的旧版本,因此我可以对照旧字段检查每个字段以进行确认,但是我不确定如何执行此操作,或者是否有更好的解决方案。我以前从未尝试过这种方法。

任何建议表示赞赏。如果没有更好的解决方案,应该如何创建白名单/遍历mega对象的所有属性/嵌套属性?

更新:
根据建议,这是我正在尝试的方法,但仍然存在一些问题(请注意,我只是在扔东西,这还不是我的最后一堂课或不错的编程):


isTraversable适用于集合,但是我不确定如何获取检查自定义类。一个Person类,仍然需要对其进行迭代。
到处都是循环引用,不确定如何处理它们。


public class Test {
       private Object obj1;
       private Object obj2;
       private List<String> whitelist;

        public void validate(Object objectToTraverse,
                             Object objectToCompareTo,
                             List<String> whitelist){
            this.obj1 = objectToTraverse;
            this.obj2 = objectToCompareTo;
            this.whitelist = whitelist;

            traverseAndCompare(obj1, obj2);
        }

        private void traverseAndCompare(Object objectToTraverse,
                                        Object objectToCompareTo){
            try {
                for (Field field : objectToTraverse.getClass()
                        .getDeclaredFields()) {

                    field.setAccessible(true);
                    Object fieldValue = field.get(objectToTraverse);

                    if (isTraversable(field)) {
                        traverseAndCompare(field.get(objectToTraverse),
                                field.get(objectToCompareTo));
                    } else {
                        getFieldValuesAndCompare(field, obj1, obj2);
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        private boolean getFieldValuesAndCompare(Field field,
                                                 Object obj1,
                                                 Object obj2)
                throws Exception{

            Object value1 = field.get(obj1);
            Object value2 = field.get(obj2);

            return compare(value1, value2);
        }

        private boolean compare(Object value1,
                                Object value2){
            return Objects.equals(value1, value2);
        }

        private boolean isTraversable(Field field){
            // This should handle collections, but it does not work
            // on custom classes, eg. Person class
            if (Collection.class.isAssignableFrom(field.getType())) {
                return true;
            }

            // Need to somehow figure out is this is a class with
            // properties I can traverse, or something with a value,
            // like String, Long, etc, hopefully
            // without listing everything

            return false;
        }
    }

最佳答案

由于对象由于法律原因无法共享,因此请提供描述性答案。

您有几种选择。每个都有优点和缺点。

反射

您可以维护不允许使用其完整路径更改的字段的列表。像a.b.c.然后,您可以编写纯反射代码,或使用http://commons.apache.org/proper/commons-beanutils/之类的通用实用工具获取值(甚至深入对象树)并进行比较。

它需要更少的代码和更少的维护。但是您需要知道黑名单字段的确切列表。明智的执行将花费更多时间。

简单的普通代码技术

用Java编写自己的比较器或方法,以遍历所有无法更改和决定的字段。需要大量代码,但非常易于维护,并且最好选择性能。

09-11 19:27
查看更多