findbugs可以检测未使用的公共方法

是否可以使用FindBugs检测源树中未使用的方法? 我在SO上看到一些post,用户声称这样做,有些人在FB中询问如何做到这一点以及其他人声称FB无法做到这一点。

有谁知道这是怎么做到的? 我只对未在其他地方明确调用的方法感兴趣,我不关心reflection。

作为FindBugs团队的一员,我可以告诉你,遗憾的是FindBugs并没有这样做。 如果您搜索我们网站上的错误模式 ,唯一提到的“未使用”探测器是针对未使用的字段

我有一个目前正在研究的项目就是这样……它很早就开始了,所以可能还有一堆漏洞:

https://github.com/mebigfatguy/deadmethods

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

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

好吧,从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远非完美,但它仍然是一个非常有用的工具。

好吧,既然你想要响应其他人的警告,你想要沿着这条路走下去,你可以复制和修改UPM探测器来做你需要的。

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

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

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

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

  • 其他库调用(对于所有非私有方法)
  • 远程呼叫
  • 通过reflectionAPI调用(甚至是私有方法,技术上讲)

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

针对整个系统运行混淆器(即您的代码和用于运行系统的所有库)可以帮助查找从未调用的公共方法(警告:当然,reflection可能会破坏该结果!)。

也许crap4j就是你所需要的。 它删除了unit testing未达到的所有代码。 这当然是最小化您的应用程序的难点。