当前位置: 首页 > 面试题库 >

找出两个Java Bean之间的差异以进行版本跟踪

毋承基
2023-03-14
问题内容

说我有一个Java bean /有100个字段的实体(是否继承,在这种情况下不相关)。更新操作后-
在事务中,我想确定修改哪些字段以跟踪CVS之类的更新。最简单的方法是什么?有任何框架建议吗?我是否应该为此对象创建两个实例并遍历所有字段并匹配字段的值?在这种情况下最佳平等方法会如何出现?以下equals()看起来很尴尬:

return (field1.equals(o.field1)) && 
(field2.equals(o.field2)) &&  
(field3.equals(o.field3)) &&  
...
(field100.equals(o.field100));

问题答案:

您可以使用Apache Commons Beanutils。这是一个简单的例子:

package at.percom.temp.zztests;

import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.BeanMap;
import org.apache.commons.beanutils.PropertyUtilsBean;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

public class Main {

    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Main main = new Main();
        main.start();
    }

    public void start() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        SampleBean oldSample = new SampleBean("John", "Doe", 1971);
        SampleBean newSample = new SampleBean("John X.", "Doe", 1971);

        SampleBean diffSample = (SampleBean) compareObjects(oldSample, newSample, new HashSet<>(Arrays.asList("lastName")), 10L);
    }

public Object compareObjects(Object oldObject, Object newObject, Set<String> propertyNamesToAvoid, Long deep) {
    return compareObjects(oldObject, newObject, propertyNamesToAvoid, deep, null);
}

private Object compareObjects(Object oldObject, Object newObject, Set<String> propertyNamesToAvoid, Long deep,
        String parentPropertyPath) {
    propertyNamesToAvoid = propertyNamesToAvoid != null ? propertyNamesToAvoid : new HashSet<>();
    parentPropertyPath = parentPropertyPath != null ? parentPropertyPath : "";

    Object diffObject = null;
    try {
        diffObject = oldObject.getClass().newInstance();
    } catch (Exception e) {
        return diffObject;
    }

    BeanMap map = new BeanMap(oldObject);

    PropertyUtilsBean propUtils = new PropertyUtilsBean();

    for (Object propNameObject : map.keySet()) {
        String propertyName = (String) propNameObject;
        String propertyPath = parentPropertyPath + propertyName;

        if (!propUtils.isWriteable(diffObject, propertyName) || !propUtils.isReadable(newObject, propertyName)
                || propertyNamesToAvoid.contains(propertyPath)) {
            continue;
        }

        Object property1 = null;
        try {
            property1 = propUtils.getProperty(oldObject, propertyName);
        } catch (Exception e) {
        }
        Object property2 = null;
        try {
            property2 = propUtils.getProperty(newObject, propertyName);
        } catch (Exception e) {
        }
        try {
            if (property1 != null && property2 != null && property1.getClass().getName().startsWith("com.racing.company")
                    && (deep == null || deep > 0)) {
                Object diffProperty = compareObjects(property1, property2, propertyNamesToAvoid,
                        deep != null ? deep - 1 : null, propertyPath + ".");
                propUtils.setProperty(diffObject, propertyName, diffProperty);
            } else {
                if (!Objects.deepEquals(property1, property2)) {
                    propUtils.setProperty(diffObject, propertyName, property2);
                    System.out.println("> " + propertyPath + " is different (oldValue=\"" + property1 + "\", newValue=\""
                            + property2 + "\")");
                } else {
                    System.out.println("  " + propertyPath + " is equal");
                }
            }
        } catch (Exception e) {
        }
    }

    return diffObject;
}

    public class SampleBean {

        public String firstName;
        public String lastName;
        public int yearOfBirth;

        public SampleBean(String firstName, String lastName, int yearOfBirth) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.yearOfBirth = yearOfBirth;
        }

        public String getFirstName() {
            return firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public int getYearOfBirth() {
            return yearOfBirth;
        }
    }
}


 类似资料:
  • 我从Spring开始学习MVC。我听说过很多次< code>Bean,它包含setter和getter。< code>Model基本上就是数据流,而< code>Pojo与< code>Bean相同。但是这个学期我真的很困惑,所有这些对我来说看起来都一样,你能解释一下它们之间的确切区别吗? JAVABEAN 波乔 型

  • 本文向大家介绍成本差异和进度差异之间的差异,包括了成本差异和进度差异之间的差异的使用技巧和注意事项,需要的朋友参考一下 对于任何应用程序或专门用于任何项目,最关注的因素之一是在开发前和开发后阶段的预算管理和时间管理。因此,要评估任何项目的这两个主要因素,有很多方法,其中成本差异和进度差异是两个重要且主要的方法。 顾名思义,“成本差异”基于项目开发中花费的成本,而“进度差异”则基于相同开发中花费的时

  • 问题内容: 我有以下两个数组。我想要这两个数组之间的区别。也就是说,如何找到两个数组都不存在的值? 问题答案: 注意: 这个答案将返回的值是不存在的,它不会返回值不在。

  • 我的问题是,我要比较Java中的两个ArrayList 例如 通过比较方法,我知道这些数组是不同的 (如果数组具有相同的元素,即使它们的顺序不同,我的方法也返回false,如果它们具有相同的元素,则返回true) 因此,该方法将返回FALSE 我的问题是: 请注意,我将在这些ArrayList中包含多个对象,而且方法效率也很重要(不是很重要,但至少很重要)。我在这里看到了答案,但我不确定哪一个更好

  • 我错过了什么?

  • 我有两个arrayList,我需要比较它们,得到唯一值,并用它们构建一个新的数组,问题是一些值是相同的,但大写,所以它们不应该显示为唯一值。这是我的代码,很好用,但是很慢 然后我找到了这个解决方案,它更快,但不比较大小写,你知道如何用这种方法或类似的方法做到这一点吗?