在大型java项目中,您使用什么工具来查找未使用的/死亡的代码?我们的产品已经开发了几年,手动检测不再使用的代码变得非常困难。但是,我们会尽量删除未使用的代码。

对于一般策略/技术(而不是特定工具)的建议也很感激。

编辑:请注意,我们已经使用了代码覆盖工具(Clover, IntelliJ),但这些帮助不大。死代码仍然有单元测试,并显示为已覆盖。我想理想的工具应该是识别那些依赖于它的其他代码很少的代码集群,从而允许手动检查文档。


当前回答

IntelliJ有代码分析工具,用于检测未使用的代码。你应该试着让尽可能多的字段/方法/类成为非公共的,这样会显示出更多未使用的方法/字段/类

我还会尝试找到重复的代码,作为减少代码量的一种方式。

我的最后一个建议是,尽量找到开放源代码,如果使用,会使您的代码更简单。

其他回答

有一些工具可以分析代码并提供代码覆盖率数据。这可以让您看到(当代码运行时)调用了多少代码。您可以使用任何这些工具来找出您有多少孤立代码。

理论上,您无法确定地找到未使用的代码。这有一个数学证明(好吧,这是一个更普遍的定理的特殊情况)。如果你很好奇,可以查一下《停止问题》。

这可以在Java代码中以多种方式表现出来:

根据用户输入、配置文件、数据库条目等加载类; 加载外部代码; 将对象树传递给第三方库; 等。

也就是说,我使用IDEA IntelliJ作为我的IDE选择,它有广泛的分析工具,可以发现模块、未使用的方法、未使用的成员、未使用的类等之间的依赖关系。它也很智能,就像一个没有被调用的私有方法被标记为未使用,但一个公共方法需要更广泛的分析。

我发现三叶草覆盖工具,仪器代码和突出显示的代码是使用和未使用的。不像谷歌CodePro分析,它也适用于WebApplications(根据我的经验,我可能是不正确的谷歌CodePro)。

我注意到的唯一缺点是它没有考虑Java接口。

我很惊讶这里竟然没有提到ProGuard。这是目前最成熟的产品之一。

ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names. Finally, it preverifies the processed code for Java 6 or for Java Micro Edition. Some uses of ProGuard are: Creating more compact code, for smaller code archives, faster transfer across networks, faster loading, and smaller memory footprints. Making programs and libraries harder to reverse-engineer. Listing dead code, so it can be removed from the source code. Retargeting and preverifying existing class files for Java 6 or higher, to take full advantage of their faster class loading.

下面是列表死代码的示例:https://www.guardsquare.com/en/products/proguard/manual/examples#deadcode

使用测试覆盖工具来检测代码库,然后运行应用程序本身,而不是测试。

Emma和Eclemma将为您提供关于在任何给定的代码运行中运行的类的百分比的良好报告。