获取两个不同的类实例并进行比较(Java)

时间:2014-04-07 15:31:30

标签: java reflection

我从前端的Ext JS应用程序接收输入,我想比较java端的两个记录,UI端表单更新前的记录和设置所有新值后的记录。我已经对相同类型的对象进行了两次引用,一次是在设置新值(oldRecord)之前,另一次是在newRecord之后)并且比较这些,但是当我尝试使用oldRecord.getClass()时旧记录它将显示新的字段值。有没有办法访问旧值?我也尝试制作两个字段数组并将它们传递给我的方法。

private static Map<String, List<String>> changes;

public static <T> Map<String, List<String>> getChanges (T oldRecord, T newRecord) {

    changes = new HashMap<String, List<String>>();

    try {
        if(oldRecord instanceof UserInfo && oldRecord.getClass().equals(newRecord.getClass())) {
            Field field = oldRecord.getClass().getDeclaredField("name");
            field.setAccessible(true);
            System.out.println(field.get(oldRecord));
            field = newRecord.getClass().getDeclaredField("name");
            field.setAccessible(true);
            System.out.println(field.get(newRecord));

            // will loop through all fields in both records and compare

        }
    } catch (Exception e) {
        System.err.println("Exception");
    }

    return changes;
}

2 个答案:

答案 0 :(得分:1)

我认为你使用的是同一个对象。如果你做了这样的事情就是这种情况:

Object oldRecord = new Object();
Object newRecord = oldRecord;
newRecord.doSomethingThatModifyIt();
getChanges(oldRecord, newRecord);

如果您已经做过类似的事情,请记住Object newRecord = oldRecord;不创建任何新对象,只是将2个变量设置为指向同一个对象。

您应该创建一个基于旧对象的新对象,并使用某些方法(如clone())来实现。或者只需手动设置新创建的对象的字段。

注意:我使用过 Object ,但它可以是任何类型的课程。

答案 1 :(得分:1)

如果oldRecord和newRecord引用相同的对象,如

T oldRecord = new T();
T newRecord = oldRecord;

他们也将“保持”相同的实例变量值。

要在oldRecord中保存旧值,您必须对该对象执行深层复制,这意味着创建一个新对象并复制实例变量值。

deep copy的搜索或克隆,可能从这里开始:How do you make a deep copy of an object in Java?