繁体   English   中英

检测 object 中的循环引用

[英]detect circular reference in an object

假设你有一个 java object,是否有可能检测circular references inside that java object

我想知道是否有图书馆可以解决这个问题。

提前致谢。

当心,这不是一件小事,但你已经知道了,对吧? ;)

在 Java 中有一个IdentityHashMap的实现,旨在用于这种情况。

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

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

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

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

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

有点横向答案,但是如何使用net.sf.json.JSONObject.fromObject(...)检查循环引用并在找到任何异常时抛出异常。 此外,如果需要,您可以配置库以不同方式处理循环引用。 您必须为存在于循环关系中的那些 class 成员编写一个 getter,因为这是 JSONObject 用来创建 JSON 的内容。

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

编码似乎是一项简单的任务。 使用 Java 反射 API 爬取 java 对象的图并收集访问对象。 如果您访问已经在集合中的 object,这意味着必须有一个电路。 爬取使用 BFS 或 DFS 算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM