如何解决检测对象中的圆形参考
| 假设您有一个Java对象,是否有可能检测到存在“ 0”的地方? 我想听听是否有图书馆来解决这个问题。 提前致谢。解决方法
有点横向的回答,但是如何使用
net.sf.json.JSONObject.fromObject(...)
检查循环引用并抛出异常(如果发现)。另外,您可以根据需要将库配置为以不同方式处理循环引用。您必须为循环关系中存在的那些类成员编写一个吸气剂,因为这是JSONObject用于创建JSON的方式。
, 当心,这不是一件容易的事,但是您已经知道了,对吧? ;)
在Java中,IdentityHashMap的实现旨在在这种情况下使用。
, 概念上很简单,但是实现起来可能非常复杂。
首先,很大程度上取决于您要处理的对象类型。如果只有少量的对象类,并且您“拥有”了这些类并可以对其进行修改以添加“自己搜索”代码,那么它将变得更加容易:
在每个类中添加一个接口,并在每个类中实现“搜索自己”方法。该方法接收对象列表,并返回返回码。该方法将自己的地址与列表中的每个对象进行比较,如果匹配,则返回true(即找到循环)。然后(如果没有匹配项)它将自己的地址添加到列表中,并依次调用其包含的每个对象引用的“搜索自己”方法。如果这些调用中的任何一个导致返回的返回码为true,则返回该返回码,否则返回false。 (这是“深度优先,递归”搜索。)
如果您不“拥有”这些类,则必须使用反射来实现上述算法,而无需修改这些类。
还可以使用其他搜索算法-“ breadth-first \”和深度优先的各种非递归版本,但是它们都代表了堆存储,堆栈存储,和性能。
, 您不需要任何库。它是简单的广度优先搜索算法和反射API。当然,您可以尝试找到实现此算法的库。
, 编写代码似乎很简单。使用Java Reflection API来爬网Java对象图并收集访问的对象。如果您访问集合中已经存在的对象,则意味着必须有一个回路。要进行爬网,请使用BFS或DFS算法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。