1

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

  1. 使用 AspectJ 为项目包中的所有方法添加“之前”方面。方面将简单地记录(?)该方法已被执行。
  2. 我编译了项目包中所有类/方法的列表(可能使用服务定位器/反射)。
  3. 建议的代码经过完整的回归测试。理想情况下,我也想将其投入生产一段时间(如果可以找到合适的性能解决方案)。
  4. 比较已执行的方法(步骤 1)和可用方法(步骤 2)的列表,得出所有从未调用过的方法(即死代码)的完整列表。

由于第 2 步和第 4 步可以离线进行,我真的只是在寻求第 1 步的帮助。

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

4

2 回答 2

1

尝试查看CoberturaEMMA等流行的测试覆盖率库。他们做的正是你所说的,然后是一些,虽然不是用 AspectJ。至少,Cobertura 似乎没有问题将调用信息存储到内存中的行。

于 2011-07-22T00:24:05.697 回答
0

好吧,您需要电话咨询前的建议。根据该建议,您需要记录被调用的方法。可能您希望保留一组调用的方法,以免重复。您可以从thisJointPoint中获取当前方法。我可以为它提供 AspectJ 代码,但我认为这不是重点。

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

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

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

于 2011-07-22T02:34:35.713 回答