尝试用反射检测Java中的循环引用

尝试用反射检测Java中的循环引用,java,reflection,circular-reference,Java,Reflection,Circular Reference,我继承了一些遗留代码,如果存在循环引用,这些代码就会失败。代码获取一个对象并构建整个对象图以转换为XML。 遗留代码无法修改,因此我希望检测引用并相应地处理它 现在,我正在建立一组图中每个对象上的所有字段,然后运行每个对象字段并尝试检测对象是否相等 这是构建集合的遗留代码部分 // declaration of set for this instance Set<Object> noduplicates = new HashSet<Object>(); privat

我继承了一些遗留代码,如果存在循环引用,这些代码就会失败。代码获取一个对象并构建整个对象图以转换为XML。 遗留代码无法修改,因此我希望检测引用并相应地处理它

现在,我正在建立一组图中每个对象上的所有字段,然后运行每个对象字段并尝试检测对象是否相等

这是构建集合的遗留代码部分

// 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)
}
我在上面尝试了几种变体,包括直接测试对象相等性。目前对hashcode相等性的测试从未检测到循环性


感谢您的指点。

最后我自己解决了这个问题。我在使用反射API时遇到的部分困惑是,例如,当您调用Field.get(object)时

对象必须是包含字段的类的实例,这很有意义,但不是直观的(至少对我来说不是这样)

文件规定:

get(Object obj)
Returns the value of the field represented by this Field, on the specified object.
最后,我提出的解决方案依赖于存储每个对象的类类型的映射,并使用该映射确定其字段是否引用它

这就是我的结局:

 boolean testForDuplicates(Set<Object> noduplicates2) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException, IntrospectionException {
    Map<Object, Object> duplicatesMap = new HashMap<Object, Object>();
    for (Object object : noduplicates2) {
        duplicatesMap.put(object.getClass(), object);
    }

    for (Object object : noduplicates2) {
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (duplicatesMap.containsKey(field.getType())) {
                Object possibleDupeFromField = duplicatesMap.get(field.getType());
                if (noduplicates2.contains(possibleDupeFromField)) {
                    return true;
                }
            }
        }
    }
    return false;
}
boolean testForDuplicates(Set noduplicates2)抛出IllegalArgumentException、IllegalAccessException、InvocationTargetException、InstanceionException、IntrospectionException{
Map duplicatesMap=newhashmap();
对于(对象对象:noduplicates2){
duplicatesMap.put(object.getClass(),object);
}
对于(对象对象:noduplicates2){
Field[]fields=object.getClass().getDeclaredFields();
用于(字段:字段){
if(duplicatesMap.containsKey(field.getType())){
Object possibleDupeFromField=duplicatesMap.get(field.getType());
if(noduplicates2.contains(可能为pefromfield)){
返回true;
}
}
}
}
返回false;
}

我将在有问题的真实代码中进行测试,如果发现任何其他问题,我将进行更新。

您当前拥有的有什么问题吗?因此,现在,当我尝试使用hashcode()进行检测时,它不起作用。尽管我知道那里有一个循环引用(我会相应地编辑我的问题)。你能分享两个POJO吗?你能提供
findAllFields
get(Object obj)
Returns the value of the field represented by this Field, on the specified object.
 boolean testForDuplicates(Set<Object> noduplicates2) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException, IntrospectionException {
    Map<Object, Object> duplicatesMap = new HashMap<Object, Object>();
    for (Object object : noduplicates2) {
        duplicatesMap.put(object.getClass(), object);
    }

    for (Object object : noduplicates2) {
        Field[] fields = object.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (duplicatesMap.containsKey(field.getType())) {
                Object possibleDupeFromField = duplicatesMap.get(field.getType());
                if (noduplicates2.contains(possibleDupeFromField)) {
                    return true;
                }
            }
        }
    }
    return false;
}