我从前端的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;
}
答案 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?