Java 逐场比较两个对象并显示差异
我想逐字段比较两个对象,即两个数据库行。 e、 g.Java 逐场比较两个对象并显示差异,java,Java,我想逐字段比较两个对象,即两个数据库行。 e、 g.Object1[name=“ABC”,年龄=29岁,电子邮件=abc@amail.com“] 和Object2[name=“XYZ”,年龄=29岁,电子邮件=xyz@amail.com“] 假设我想要比较这两个对象,我想要这样的输出 [{ "fieldName" : "email", "OldObjectValue" : "abc@amail.com", "NewObjectValue" : "xyz@amail.com" }, { "
Object1[name=“ABC”,年龄=29岁,电子邮件=abc@amail.com“]
和Object2[name=“XYZ”,年龄=29岁,电子邮件=xyz@amail.com“]
假设我想要比较这两个对象,我想要这样的输出
[{
"fieldName" : "email",
"OldObjectValue" : "abc@amail.com",
"NewObjectValue" : "xyz@amail.com"
},
{
"fieldName" : "name",
"OldObjectValue" : "ABC",
"NewObjectValue" : "XYZ"
}]
此处年龄相同,因此输出中不存在年龄字段
如果这可以通过使用反射的泛型方法实现,请提供一些代码。因为我还没有进行反思。
请帮助。根据您的要求,您可以按如下方式进行操作 可以将两个数据库行添加到两个对象中。样本对象
public class SampleObject {
private String name;
private int age;
private String email;
public SampleObject(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
.
.
public List<ResultObject> compareFields(SampleObject object) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
List<ResultObject> resultList = new ArrayList<ResultObject>();
Field[] fields = this.getClass().getDeclaredFields();
for(Field field : fields){
if(!field.get(this).equals(field.get(object))){
ResultObject resultObject = new ResultObject();
resultObject.setFieldName(field.getName());
resultObject.setOldObjectValue(field.get(this).toString());
resultObject.setNewObjectValue(field.get(object).toString());
resultList.add(resultObject);
}
}
return resultList;
}
我想你的结果也会成为一个目标。例如:结果对象
public class ResultObject {
private String fieldName;
private String OldObjectValue;
private String NewObjectValue;
.
.
您只需在SampleObject中定义compareField类方法
public class SampleObject {
private String name;
private int age;
private String email;
public SampleObject(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
.
.
public List<ResultObject> compareFields(SampleObject object) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
List<ResultObject> resultList = new ArrayList<ResultObject>();
Field[] fields = this.getClass().getDeclaredFields();
for(Field field : fields){
if(!field.get(this).equals(field.get(object))){
ResultObject resultObject = new ResultObject();
resultObject.setFieldName(field.getName());
resultObject.setOldObjectValue(field.get(this).toString());
resultObject.setNewObjectValue(field.get(object).toString());
resultList.add(resultObject);
}
}
return resultList;
}
public List compareFields(SampleObject对象)抛出IllegaAccessException、IllegalArgumentException、InvocationTargetException{
List resultList=new ArrayList();
Field[]fields=this.getClass().getDeclaredFields();
用于(字段:字段){
如果(!field.get(this).equals(field.get(object))){
ResultObject ResultObject=新的ResultObject();
resultObject.setFieldName(field.getName());
resultObject.setOldObjectValue(field.get(this.toString());
resultObject.setNewObjectValue(field.get(object.toString());
结果列表.add(resultObject);
}
}
返回结果列表;
}
然后你可以让它工作
SampleObject object1 = new SampleObject("ABC", 29, "abc@amail.com");
SampleObject object2 = new SampleObject("XYZ", 29, "xyz@amail.com");
List<ResultObject> resultList = object1.compareFields(object2);
sampleobject1=新的SampleObject(“ABC”,29,”abc@amail.com");
SampleObject object2=新的SampleObject(“XYZ”,29,”xyz@amail.com");
List resultList=object1.compareFields(object2);
谢谢如果您希望在业务逻辑中实现这一点,那么它可能会出现在Java代码中,在这种情况下,Hibernate标记可能不合适。@bitstrider我尝试使用equals和==手动比较每个字段的输出,将其存储在对象中?最好是为业务逻辑实现它。如果你想要一些更一般的反射是needed@bitstrider是的..我想将其存储在对象中并发送回ResponseAnks以获得帮助…如果我在一个对象中有20个字段,那么此代码将不会有帮助,因为我必须比较每个字段…我需要此问题的通用解决方案是的。通用解决方案的唯一问题是获取字段名。但是我们也可以使用java反射来获取字段名。如果是这样的话,我们可以用一般的方式来写。答案已经更新了。使用java反射作为通用解决方案。谢谢