Java如何知道谁在修改ArrayList?

时间:2017-02-19 22:07:04

标签: java arraylist

有没有办法打印ArrayList ConcurrentModificationExceptionIterator.next()时修改public class MainActivity extends AppCompatActivity { Toolbar toolbar; TabLayout tabLayout; ViewPager viewPager; ViewPagerAdapter viewPagerAdapter; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); toolbar = (Toolbar) findViewById(R.id.toolBar); setSupportActionBar(toolbar); tabLayout = (TabLayout) findViewById(R.id.tabLayout); viewPager = (ViewPager) findViewById(R.id.viewPager); viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); viewPagerAdapter.addFragments(new A(), "A"); viewPagerAdapter.addFragments(new B(), "B"); viewPagerAdapter.addFragments(new C(), "C"); viewPager.setAdapter(viewPagerAdapter); tabLayout.setupWithViewPager(viewPager); } } 的人?

2 个答案:

答案 0 :(得分:1)

如果仅用于调试和临时故障排除,我建议使用动态java.lang.reflect.Proxy。如果您控制ArrayList的创建,这将有效。使用代理可以拦截迭代器创建,也可以为它创建代理。

基本上,在代理拦截的每个方法之前和之后添加日志记录。然后,您可以分析日志以查看方法调用的流程。 要了解如何创建代理,有很多很棒的博客和示例,但我建议您从Java Reflection Guide at Oracle Docs开始。有一个例子与你需要的非常相似。

HTH。

更新:当然代理只能用于接口,即只有在代码中没有严格引用ArrayList时才会使用代理(除了实例化它)。否则,您需要重构代码才能在声明中使用List而不是ArrayList ...

答案 1 :(得分:0)

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

  

此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外, < em>迭代器将抛出ConcurrentModificationException

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

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