我正在尝试编写一个用于接收大型对象的类,并确保仅更改了某些字段,通常您会以这种方式注释/添加验证,但是不幸的是,在这种情况下,这不是一种选择,我唯一能做的change是我正在研究的一类,它将收到我应该以某种方式验证的非常大(且非常嵌套!)的对象。
我最初的想法是制作一个可以更改的事物的“列表”,然后遍历该对象中的所有属性,并检查是否有不属于“白名单”的任何更新,我拥有该对象的旧版本,因此我可以对照旧字段检查每个字段以进行确认,但是我不确定如何执行此操作,或者是否有更好的解决方案。我以前从未尝试过这种方法。
任何建议表示赞赏。如果没有更好的解决方案,应该如何创建白名单/遍历mega对象的所有属性/嵌套属性?
更新:
根据建议,这是我正在尝试的方法,但仍然存在一些问题(请注意,我只是在扔东西,这还不是我的最后一堂课或不错的编程):
isTraversable适用于集合,但是我不确定如何获取检查自定义类。一个Person类,仍然需要对其进行迭代。
到处都是循环引用,不确定如何处理它们。
public class Test {
private Object obj1;
private Object obj2;
private List<String> whitelist;
public void validate(Object objectToTraverse,
Object objectToCompareTo,
List<String> whitelist){
this.obj1 = objectToTraverse;
this.obj2 = objectToCompareTo;
this.whitelist = whitelist;
traverseAndCompare(obj1, obj2);
}
private void traverseAndCompare(Object objectToTraverse,
Object objectToCompareTo){
try {
for (Field field : objectToTraverse.getClass()
.getDeclaredFields()) {
field.setAccessible(true);
Object fieldValue = field.get(objectToTraverse);
if (isTraversable(field)) {
traverseAndCompare(field.get(objectToTraverse),
field.get(objectToCompareTo));
} else {
getFieldValuesAndCompare(field, obj1, obj2);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private boolean getFieldValuesAndCompare(Field field,
Object obj1,
Object obj2)
throws Exception{
Object value1 = field.get(obj1);
Object value2 = field.get(obj2);
return compare(value1, value2);
}
private boolean compare(Object value1,
Object value2){
return Objects.equals(value1, value2);
}
private boolean isTraversable(Field field){
// This should handle collections, but it does not work
// on custom classes, eg. Person class
if (Collection.class.isAssignableFrom(field.getType())) {
return true;
}
// Need to somehow figure out is this is a class with
// properties I can traverse, or something with a value,
// like String, Long, etc, hopefully
// without listing everything
return false;
}
}
最佳答案
由于对象由于法律原因无法共享,因此请提供描述性答案。
您有几种选择。每个都有优点和缺点。
反射
您可以维护不允许使用其完整路径更改的字段的列表。像a.b.c.然后,您可以编写纯反射代码,或使用http://commons.apache.org/proper/commons-beanutils/之类的通用实用工具获取值(甚至深入对象树)并进行比较。
它需要更少的代码和更少的维护。但是您需要知道黑名单字段的确切列表。明智的执行将花费更多时间。
简单的普通代码技术
用Java编写自己的比较器或方法,以遍历所有无法更改和决定的字段。需要大量代码,但非常易于维护,并且最好选择性能。