使用AspectJ在Java中查找未使用的代码

时间:2011-07-22 00:13:32

标签: java performance aspectj dead-code

我有一个在大型Java项目中查找未使用('死')方法的想法,但我需要帮助来推导实现。

  1. 使用AspectJ为项目包中的所有方法添加'before'方面。方面将简单地记录(?)该方法已被执行。
  2. 我编译项目包中所有类/方法的列表(可能使用服务定位器/反射)。
  3. 建议的代码需要进行完整的回归测试。理想的情况下, 我想把它投入生产一段时间(如果适当的话) 可以找到高效的解决方案。)
  4. 执行方法列表(步骤1)和可用方法(步骤 2)进行比较,得出所有方法的综合列表 从未被称为(即死代码)。
  5. 由于步骤2和4可以离线进行,我实际上只是寻求步骤1的帮助。

    具体来说,如何记录方法执行时?我想如果我尝试任何类型的内存存储,我很快就会遇到OutOfMemoryErrors。同样,如果我将数据存储在数据库/文件系统中,则调用量可能会导致严重的性能问题。有没有人做过类似的事情?任何意见/建议表示赞赏。

2 个答案:

答案 0 :(得分:1)

尝试查看热门的测试覆盖率库,例如CoberturaEMMA。他们正是你正在谈论的,然后是一些,尽管不是与AspectJ。至少,Cobertura似乎没有问题将调用信息存储到内存中的行。

答案 1 :(得分:0)

嗯,你想要一个前呼叫建议。根据该建议,您需要记录被调用的方法。可能你想要保留一组调用的方法,这样你就不会重复了。您可以从 thisJointPoint 中获取当前方法。我可以为它提供AspectJ代码,但我认为它不是重点。

我认为你最好只使用工具来解析使用BECLASM的二进制.class文件,从你知道调用的方法开始,并构建一个调用图。这类似于JVM进行垃圾收集的方式。

但是,你应该问问自己这是什么。是性能吗?因为影响应该是没有的。如果你想减小.class文件的大小,你最好使用像ProGuard这样的东西。这将解决这个和其他问题及其已经发生的问题。

那就是说,如果你真的想这样做,我认为最好的方法是使用Cobertura来测试你的代码,并对你的应用程序进行一次运行,然后查看你的覆盖率报告。花费90%的已用代码不应该花很长时间。可以删除而不会导致编译错误的任何未调用方法都是死代码。