【发布时间】:2015-05-25 09:12:23
【问题描述】:
如果存在循环引用,我继承了一些失败的遗留代码。该代码获取一个对象并构建整个对象图以转换为 XML。 遗留代码无法修改,所以我想检测引用并进行相应处理。
现在,我正在为图表中的每个对象构建一组所有字段,然后运行每个对象字段并尝试检测对象是否相等。
这是构建 Set 的遗留代码部分。
// declaration of set for this instance
Set<Object> noduplicates = new HashSet<Object>();
private Iterator<Field> findAllFields(Object o) {
Collection<Field> result = new LinkedList<Field>();j
Class<? extends Object> c = o.getClass();
while (c != null) {
Field[] f = c.getDeclaredFields();
for (int i = 0; i < f.length; i++) {
if (!Modifier.isStatic(f[i].getModifiers())) {
result.add(f[i]);
}
}
c = c.getSuperclass();
}
// add the fields for each object, for later comparison
noduplicates.addAll((Collection<?>) result);
testForDuplicates(noduplicates)
}
这是当前检测循环的尝试(灵感来自:https://stackoverflow.com/a/2638662/817216):
private void testForDuplicates(Set<Object> noduplicates) throws ... {
for (Object object : noduplicates) {
Field[] fields = object.getClass().getFields();
for (Field field : fields) {
for (PropertyDescriptor pd : Introspector.getBeanInfo(field.getClass()).getPropertyDescriptors()) {
if (pd.getReadMethod() != null && !"class".equals(pd.getName())) {
Object possibleDuplicate = pd.getReadMethod().possibleDuplicate(object);
if (object.hashCode() == possibleDuplicate.hashCode()) {
System.out.println("Duplicated detected");
throw new RuntimeException();
}
}
}
}
}
}
我有一个非常简单的测试用例,两个 POJO,每个都引用另一个:
class Prop {
private Loc loc;
public Loc getLoc() {
return loc;
}
public void setLoc(Loc loc) {
this.loc = loc;
}
}
class Loc {
private Prop prop;
public Prop getProp() {
return prop;
}
public void setProp(Prop prop) {
this.prop = prop;
}
}
我在上面尝试了几种变体,包括直接测试对象相等性。目前对哈希码相等性的测试从未检测到循环性。
感谢您的指点。
【问题讨论】:
-
那么你目前拥有的有什么问题?
-
所以现在,当我尝试使用 hashcode() 进行检测时,它不起作用。即使我知道那里有一个循环引用(我会相应地编辑我的问题。)
-
你能分享两个 POJO 吗?
-
你能提供
findAllFields的论据是什么
标签: java reflection circular-reference