Java 逐场比较两个对象并显示差异

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" }, { "

我想逐字段比较两个对象,即两个数据库行。 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"
},
{
 "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反射作为通用解决方案。谢谢