我有一个在大型Java项目中查找未使用('死')方法的想法,但我需要帮助派生实现。
- 使用AspectJ为项目包中的所有方法添加一个'before'方面。方面将简单地记录(?)方法已经执行。 我编译了项目包中所有类/方法的列表(可能使用服务定位器/反射)。
- 建议的代码要经过完整的回归测试。理想情况下,我也想把它投入生产一段时间(如果合适的话)
- 已执行方法(步骤1)和可用方法(步骤1)的列表2)进行了比较,得出了所有方法的综合列表从未被调用(即死代码)。
由于步骤2和步骤4可以离线进行,所以我实际上只寻求步骤1的帮助。
具体来说,如何记录方法何时执行?我想,如果我尝试使用任何类型的内存存储,我很快就会遇到OutOfMemoryErrors。同样,如果我将数据存储在数据库/文件系统中,那么大量的调用可能会导致主要的性能问题。有人做过类似的事情吗?
尝试检查流行的测试覆盖库,如Cobertura或EMMA。它们完全按照您所说的去做,但不是AspectJ。至少,Cobertura似乎可以将调用信息存储到内存中的一行。
你需要一个呼叫前建议。根据该建议,您将希望记录正在调用的方法。您可能希望保留一组被调用的方法,这样就不会得到重复的方法。你可以从thisJointPoint中获取当前方法。我可以给它AspectJ代码,但我认为这是无关紧要的。
我认为您最好使用工具来解析二进制.class文件,使用BECL或ASM,从您知道被调用的方法开始,并构建调用图。这与JVM进行垃圾收集的方式类似。
但是,你真的应该问问你自己,你到底是什么。是性能吗?因为影响应该是零。如果你想减少。class文件的大小,你最好使用ProGuard之类的工具。这样就能解决这个问题了,而且已经解决了。
也就是说,如果你真的想这样做,我认为最好的方法是使用Cobertura来检测你的代码,并对你的应用程序进行一次运行,然后查看你的覆盖率报告。用不了多久,90%的代码就会被绘制出来。任何可以删除而不会导致编译错误的未调用方法都是死代码。