Java 如何比较任何对象的两个实例并获得;肮脏的;领域

Java 如何比较任何对象的两个实例并获得;肮脏的;领域,java,compare,Java,Compare,我有一个util,它可以获取许多对象对(具有相同的祖先)。 util然后将它们发布到其他客户端。我想添加差异的表示(例如,包含所有“脏”字段的映射/列表) 我怎样才能一般地做到这一点?还是应该为每个对象实现它?我的2美分 您可以解析反射包,获取对象的getter(假设数据对象已正确封装),然后尝试比较结果。但是性能真的很差,这不适用于任何生产系统 如果您可以控制数据对象类,那么可以实现自己的接口并生成自己的数据对象。使用枚举标识每个字段,并为每个数据对象类指定一个特定的枚举类。最好使用此接口的代

我有一个util,它可以获取许多对象对(具有相同的祖先)。
util然后将它们发布到其他客户端。我想添加差异的表示(例如,包含所有“脏”字段的映射/列表)

我怎样才能一般地做到这一点?还是应该为每个对象实现它?

我的2美分

  • 您可以解析反射包,获取对象的getter(假设数据对象已正确封装),然后尝试比较结果。但是性能真的很差,这不适用于任何生产系统

  • 如果您可以控制数据对象类,那么可以实现自己的接口并生成自己的数据对象。使用枚举标识每个字段,并为每个数据对象类指定一个特定的枚举类。最好使用此接口的代码生成器和相关方法来完成此操作

  • 这是你想要的吗

    publicstaticlist比较(to1,to2)抛出非法访问异常{
    列出不同的字段=新建LinkedList();
    如果(o1!=o2){
    类clazz=o1.getClass();
    Field[]fields=clazz.getDeclaredFields();
    用于(字段f:字段){
    布尔可访问=f.isAccessible();
    如果(!可访问){
    f、 setAccessible(true);
    }
    对象o1f=f.get(o1);
    对象o2f=f.get(o2);
    如果(!Objects.equals(o1f,o2f)){
    不同字段。添加(f);
    }
    f、 设置可访问(可访问);
    }
    }
    返回不同的字段;
    }
    
    您可能需要查看,或者。这个问题的答案可能也很有用,它看起来像是它的复制品。反射并不快,但“真的很糟糕”是一种延伸。根据用例的不同,它可能是可以接受的。我同意。可能是因为我在高性能系统上工作太多了:-)但是看看他的应用程序,我怀疑他在数据对象方面做了些什么,并且有理由假设这样的比较做了很多。但正如你所说,没有什么是绝对的。这种情况下通常可以使用什么样的代码生成器?
    public static <T> List<Field> compare(T o1, T o2) throws IllegalAccessException {
    
        List<Field> differentFields = new LinkedList<>();
        if(o1 != o2){
            Class clazz = o1.getClass();
            Field[] fields = clazz.getDeclaredFields();
            for(Field f: fields){
                boolean accessible = f.isAccessible();
                if(! accessible){
                    f.setAccessible(true);
                }
                Object o1f = f.get(o1);
                Object o2f = f.get(o2);
                if(!Objects.equals(o1f, o2f)){
                    differentFields.add(f);
                }
                f.setAccessible(accessible);
            }
        }
        return differentFields;
    }