8

是否可以使用 FindBugs 检测源树中未使用的方法?我在 SO 上看到一些帖子,用户声称这样做,其他一些帖子询问如何在 FB 中执行此操作,而其他一些帖子则声称 FB 无法执行此操作。

有谁知道这是怎么做到的?我只对没有从其他地方显式调用的方法感兴趣,我不关心反射。

4

8 回答 8

13

作为 FindBugs 团队的一员,我可以告诉你,很遗憾 FindBugs 不这样做。如果您在我们的网站上搜索错误模式,“未使用”检测器的唯一提及是未使用的字段

于 2011-01-20T20:08:44.427 回答
2

我有一个我目前正在做的项目就是这样做的……现在还很早,所以可能还剩下一堆错误:

https://github.com/mebigfatguy/deadmethods

于 2011-01-24T04:19:02.267 回答
1

我想 Findbugs 很有可能报告与报告私有方法不同的公共方法(或者我正在考虑编译器标志:-)。

真正的问题是为什么你也想要?如果您正在编写一个封闭且永远不会扩展的程序,那么定位未使用的方法可以让您有机会删除它们。但是,如果您正在编写 API,您无法预测谁会需要这些方法,因此报告它们没有多大意义。

于 2011-01-18T06:42:13.657 回答
1

好吧,从findbugs-1.3.9开始,它似乎没有捕获未使用的方法。

当我在这个小样本上运行 findbugs 时:

public class TestJava
{
 int j;
 public static void main(String[] args)
 { 
   System.out.println("Nothing.");
 }
 public void foo()
 {
 }
 public static void bar()
 {
 }
}

它没有发现 foo 和 bar 都没有使用。它确实发现 TestJava.j 是一个未使用的字段

Unused field
This field is never used.  Consider removing it from the class.

findbugs 远非完美,但它仍然是一个非常有用的工具。

于 2011-01-18T06:50:11.100 回答
1

好吧,既然你想沿着这条路线走,尽管其他人已经做出了回应:),你可以复制和修改UPM 检测器来做你需要的事情。

为 FindBugs 编写检测器非常简单(尤其是当您有一个很好的起点时)。阅读本文以帮助您入门

于 2011-01-18T07:00:58.697 回答
0

(对我而言)寻找未使用方法的候选者的最佳方法是使用覆盖工具,如 emma。

检测您的应用程序,过度使用它并检查 emma 日志 - 会话期间未使用的方法可能未使用,您可以使用您最喜欢的 IDE(eclipse,...)来检查未访问的方法调用层次结构。

我怀疑,发现错误或任何其他代码分析器真的可以检测未使用的方法,因为方法可能是

  • 由其他库调用(对于所有非私有方法)
  • 远程调用
  • 通过反射 API 调用(甚至是私有方法,从技术上讲)
于 2011-01-18T06:42:21.587 回答
0

删除未使用的代码(包括未使用的公共方法)是混淆器所做的一件事。问题是你不能仅仅通过查看包含它的类来判断是否使用了公共方法。您需要查看将要运行的整个系统,因为可能会从任何地方调用公共方法。

对整个系统(即您的代码和用于运行系统的所有库)运行混淆器可以帮助找到从未调用过的公共方法(警告:当然,反射会弄乱该结果!)。

于 2011-01-18T07:23:50.947 回答
0

也许 crap4j 是你需要的。它删除了单元测试未达到的所有代码。这当然是最小化您的应用程序的艰难方法。

于 2011-01-18T07:27:31.493 回答