gpt4 book ai didi

Java - 针对白名单的手动对象验证

转载 作者:行者123 更新时间:2023-12-01 18:11:40 25 4
gpt4 key购买 nike

我正在尝试编写一个类来获取大型对象,并确保仅更改了某些字段,通常您会以这种方式注释/添加验证,但不幸的是,在这种情况下这不是一个选项,唯一的选择我可以改变的是我正在处理的一个类,它将接收一个非常大(而且非常嵌套!)的对象,我应该以某种方式验证它。

我最初的想法是制作一个可以更改的内容的“列表”,然后迭代对象中的所有属性并检查是否有不在“白名单”上的内容已更新,我有旧版本对象,因此我可以对照旧字段检查每个字段以进行确认,但我不完全确定如何执行此操作,或者是否有更好的解决方案。我以前从未尝试过这样的事情。

如有任何建议,我们将不胜感激。如果没有更好的解决方案,我应该如何创建白名单/迭代巨型对象的所有属性/嵌套属性?

更新:根据这些建议,这是我正在尝试的,但它仍然存在一些问题(请注意,我只是乱扔东西,这绝不是我的最后一个类或良好的编程):

  1. isTraversable 适用于集合,但我不确定如何检查自定义类,例如。 Person 类,仍然需要迭代。
  2. 到处都是循环引用,也不知道如何处理它们。
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;
}
}

最佳答案

由于法律原因无法共享对象,因此给出了描述性答案。

你有几个选择。各有利弊。

反射(reflection)

您可以维护不允许更改的字段列表及其完整路径。就像 a.b.c.然后,您可以编写纯反射代码或使用常见的实用程序,例如 http://commons.apache.org/proper/commons-beanutils/获取值(甚至在对象树的深处)并进行比较。

它需要更少的代码和更少的维护。但您需要知道黑名单字段的确切列表。就性能而言,这将花费更多时间。

简单的纯代码技术

用java编写自己的比较器或方法来遍历所有不能改变的字段并做出决定。需要大量代码,但非常易于维护并且性能最佳。

关于Java - 针对白名单的手动对象验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60459055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com