Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java项目中查找未使用/失效的代码_Java_Refactoring_Dead Code - Fatal编程技术网

如何在java项目中查找未使用/失效的代码

如何在java项目中查找未使用/失效的代码,java,refactoring,dead-code,Java,Refactoring,Dead Code,在大型java项目中,您使用什么工具来查找未使用/失效的代码?我们的产品已经开发了几年,手动检测不再使用的代码变得非常困难。但是,我们会尽可能多地删除未使用的代码 对于一般策略/技术(特定工具除外)的建议也表示感谢 编辑:请注意,我们已经使用了代码覆盖工具(Clover、IntelliJ),但这些工具没有什么帮助。死代码仍然有单元测试,并显示为已覆盖。我想一个理想的工具应该能够识别那些几乎没有其他代码依赖的代码集群,从而允许文档手动检查。Eclipse可以显示/突出显示无法访问的代码。JUnit

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

对于一般策略/技术(特定工具除外)的建议也表示感谢


编辑:请注意,我们已经使用了代码覆盖工具(Clover、IntelliJ),但这些工具没有什么帮助。死代码仍然有单元测试,并显示为已覆盖。我想一个理想的工具应该能够识别那些几乎没有其他代码依赖的代码集群,从而允许文档手动检查。

Eclipse可以显示/突出显示无法访问的代码。JUnit可以向您显示代码覆盖率,但您需要进行一些测试,并且必须确定相关测试是否丢失或代码是否确实未使用

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

理论上,您无法确定地找到未使用的代码。这有一个数学证明(这是一个更一般定理的特例)。如果你好奇的话,查一下停顿问题

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

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

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

我们已经开始使用它来帮助识别代码库中目标丰富的重构环境中的一些恐惧。我也会考虑在代码库的体系结构中找出太复杂的点,所以你知道真正的沼泽在哪里。

< P>我会使用运行系统来保持代码使用的日志,然后开始检查不使用数月或数年的代码。 例如,如果您对未使用的类感兴趣,则可以在创建实例时检测所有类以记录日志。然后,一个小脚本可以将这些日志与完整的类列表进行比较,以找到未使用的类


当然,如果您选择方法级别,您应该记住性能。例如,这些方法只能记录它们的首次使用。我不知道用Java怎么做才是最好的。我们在Smalltalk中做到了这一点,Smalltalk是一种动态语言,因此允许在运行时修改代码。我们使用一个日志调用来检测所有方法,并在方法第一次被日志记录后卸载日志代码,因此在一段时间后不再发生性能损失。也许在Java中可以使用静态布尔标志做类似的事情…

一个运行良好的Eclipse插件是


它处理整个项目或特定文件,并显示各种未使用/死代码方法,以及建议可见性更改(即可以保护或私有的公共方法)。

用户覆盖工具,如EMMA。但它不是静态工具(也就是说,它需要通过回归测试和所有可能的错误情况来实际运行应用程序,这是不可能的:)


尽管如此,EMMA还是非常有用。

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


并且将为您提供关于在任何给定的代码运行中运行的类所占百分比的良好报告。

代码覆盖工具,如Emma、Cobertura和Clover,将为您的代码插入指令,并记录通过运行一系列测试调用的代码部分。这是非常有用的,应该是开发过程中不可或缺的一部分。它将帮助您确定测试套件对代码的覆盖程度

然而,这与识别真正的死代码不同。它只标识测试覆盖(或未覆盖)的代码。这可能会给您带来误报(如果您的测试没有覆盖所有场景)以及误报(如果您的测试访问的代码实际上从未在真实场景中使用)

我认为,真正识别死代码的最佳方法是在实时运行环境中使用覆盖率工具对代码进行测试,并在较长时间内分析代码覆盖率

如果您是在负载平衡的冗余环境中运行(如果不是,为什么不是?),那么我认为只对应用程序的一个实例进行检测是有意义的,并且配置负载平衡器以使随机但很小的一部分用户在检测的实例上运行。如果您在一段较长的时间内这样做(以确保您已经涵盖了所有真实世界的使用场景——如季节性变化),您应该能够准确地看到在真实世界的使用下访问了代码的哪些区域,以及哪些部分确实从未访问过,因此是死代码

我个人从未见过这样做,也不知道如何使用上述工具来检测和分析未通过测试套件调用的代码,但我确信它们可以做到。

  • FindBugs非常适合做这类事情
  • PMD(项目混乱检测器)是另一个可以使用的工具

但是,两者都找不到工作区中未使用的公共静态方法。如果有人知道这样一个工具,请告诉我。

我在Eclipse中所做的一件事,就是在一个类上,将它的所有方法更改为private,然后看看我收到了什么投诉。对于所使用的方法,该