能否通过FindBugs检测未使用的公共方法?

10

使用FindBugs检测源代码树中未使用的方法是否可能?我在Stack Overflow上看到有些用户声称可以这样做,还有一些人询问如何在FB中执行此操作,以及其他人声称FB无法执行此操作。

有没有人确切知道如何进行此操作?我只关心未从其他地方显式调用的方法,不关心反射。


我知道你可以使用IntelliJ(免费版)来做到这一点(同时还可以进行自动化删除)。它具有超过650个检查。我认为你可以用FindBugs来完成这个任务。 - Peter Lawrey
谢谢彼得,但我被Eclipse卡住了 :( - Miserable Variable
8个回答

15
作为FindBugs团队的一员,我可以告诉你遗憾的是,FindBugs并不会做到这一点。如果您在我们网站上搜索漏洞模式,唯一提到“未使用”检测器的是用于未使用字段的部分。

1
这个答案有点过时了。链接已经更改为http://findbugs.sourceforge.net/bugDescriptions.html,并且有一个针对_private_方法的规则:http://findbugs.sourceforge.net/bugDescriptions.html#UPM_UNCALLED_PRIVATE_METHOD - MikeFHay

3

1

我想 Findbugs 可以很容易地报告公共方法和私有方法一样未使用的情况(或者我是在想编译器标志 :-)。

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


3
德里克,你自己回答了这个问题 :) - Miserable Variable

1

好的,既然你想要继续这条路,尽管其他回答者已经警告过你 :), 你可以复制并修改UPM detector来实现你需要的功能。

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


谢谢Ryan。我刚开始使用FB,没有扩展检测器的经验,感谢提供的链接。但是为公共方法扩展UPM并不容易--被调用和所有方法都必须存储在项目级别。你能不能给我指一下这样的检测器? - Miserable Variable
好问题,如果我戴上我的黑客编码帽子,我会告诉你尝试使用静态变量来解决这个问题,因为我只在一个JVM上运行findbugs,我相信我不会遇到任何类加载器的问题。 - Ryan Fernandes

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


0

对我来说,找到未使用方法的最佳方法是使用覆盖率工具,例如emma。

对应用程序进行仪器化,过度使用并检查emma日志 - 在会话期间未使用的方法可能未被使用,您可以使用您喜欢的IDE(eclipse,...)来检查未访问的方法调用层次结构。

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

  • 被其他库调用(对于所有非私有方法)
  • 远程调用
  • 通过反射API调用(即使是私有方法,在技术上说)

0

删除未使用的代码(包括未使用的公共方法)是混淆器的一项功能。问题在于,仅通过查看包含它的类,你无法确定公共方法是否被使用。你需要查看整个将要运行的系统,因为公共方法可能从任何地方调用。

对整个系统(即你的代码和所有用于运行系统的库)运行混淆器可以帮助找到从未被调用的公共方法(注意:反射当然会影响结果!)。


是的,我找到了一些可以做到这一点的混淆器,我特别想使用FindBugs。 - Miserable Variable

0
也许crap4j是你需要的。它会删除所有未被单元测试覆盖到的代码。当然,这是一种减少应用程序体积的较为困难的方式。

我也发现了http://www.ucdetector.org,声称可以完成这项工作,但我还没有尝试过。 - Miserable Variable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接