Java如何知道谁在修改阵列列表



是否有一种方法可以打印出谁在Iterator.next()上的ConcurrentModificationException时修改ArrayList

如果仅用于调试和暂时的故障拍摄,我可以建议使用动态java.lang.reflect.Proxy。如果您控制ArrayList的创建,这将起作用。使用代理您也可以拦截迭代器创建一个为其创建代理。

基本上,在每种方法之前和之后,添加登录代理截距。然后,您可以分析日志以查看方法的流动流量。要了解如何创建代理,有很多很棒的博客和示例,但是我建议您从Oracle Docs的Java Reflection指南开始。有一个与您需要的相似的例子。

hth。

更新:当然,代理只能与接口一起使用,即仅当您不严格地参考代码中的ArrayList(除了实例化之外)。否则,您需要对代码进行重构以在声明中使用List,而不是ArrayList ...

来自Javadoc的ArrayList(我的重点):

该类的迭代器返回的迭代器和ListIterator方法是失败的:如果列表在创建迭代器后的任何时间进行结构修改,则以任何方式,除非通过迭代器自己的删除或添加 <<strong> <<strong> 迭代器将投掷consurrentModificationException

因此,访问迭代器会引发异常,而不是修改线程。您可能不会在发生时发现修改,并且CME仅在尝试通过现有迭代器提出值或获取值时才发生。

如果您必须检测修改操作,则可能必须包装实现。

最新更新