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