检测对象中的循环引用

时间:2011-05-30 12:31:13

标签: java

假设您有一个java对象,是否可以检测到哪里存在circular references inside that java object

我想知道是否有图书馆来处理这个问题。

提前致谢。

5 个答案:

答案 0 :(得分:4)

要注意,这不是一项微不足道的任务,但你已经知道了,对吧? ;)

在Java中,IdentityHashMap的实现旨在用于此类情况。

答案 1 :(得分:2)

概念上很简单,但实施起来可能相当复杂。

首先,很大程度上取决于您正在处理的对象类型。如果只有少量的对象类,并且你“拥有”这些类并且可以修改它们以添加“自己搜索”代码,那么它就变得容易了:

为每个类添加一个接口,并在每个类中实现“自己搜索”方法。该方法接收对象列表,并返回返回码。该方法将其自己的地址与列表中的每个对象进行比较,如果匹配则返回true(即,找到循环)。然后(如果不匹配)它将自己的地址添加到列表中,并依次调用它包含的每个对象引用的“搜索自己”方法。如果这些调用中的任何一个导致返回真正的返回代码,则返回该代码,否则返回false。 (这是“深度优先,递归”搜索。)

如果您没有“拥有”这些类,那么您必须使用反射来实现上述算法而不修改类。

还可以使用其他搜索算法 - “广度优先”,以及深度优先的各种非递归版本,但它们都代表堆存储,堆栈存储之间的一种或另一种权衡和表现。

答案 2 :(得分:1)

有点横向回答,但如果使用net.sf.json.JSONObject.fromObject(...) checks for circular references并如果找到任何异常则抛出异常怎么样呢?此外,您可以配置库以在必要时以不同方式处理循环引用。您必须为存在于循环关系中的那些类成员编写一个getter,因为这是JSONObject用来创建JSON的。

答案 3 :(得分:0)

您不需要任何图书馆。它是简单的广度优先搜索算法和反射API。当然,您可以尝试找到实现此算法的库。

答案 4 :(得分:0)

编码似乎很简单。使用Java Reflection API来抓取java对象的图形并收集访问对象。如果您访问已在集合中的对象,则表示必须存在电路。要抓取使用BFS或DFS算法。

相关问题