使用FindBugs检测源代码树中未使用的方法是否可能?我在Stack Overflow上看到有些用户声称可以这样做,还有一些人询问如何在FB中执行此操作,以及其他人声称FB无法执行此操作。
有没有人确切知道如何进行此操作?我只关心未从其他地方显式调用的方法,不关心反射。
使用FindBugs检测源代码树中未使用的方法是否可能?我在Stack Overflow上看到有些用户声称可以这样做,还有一些人询问如何在FB中执行此操作,以及其他人声称FB无法执行此操作。
有没有人确切知道如何进行此操作?我只关心未从其他地方显式调用的方法,不关心反射。
我目前正在开发一个项目,可以做到这一点......不过还处于早期阶段,可能还有很多bug:
我想 Findbugs 可以很容易地报告公共方法和私有方法一样未使用的情况(或者我是在想编译器标志 :-)。
真正的问题是为什么你想要这样做?如果你正在编写一个封闭的程序并且永远不会扩展它,那么找出未使用的方法可以让你有机会将它们删除。但是如果你正在编写一个 API,你无法预测谁需要这些方法,因此报告它们没有太多意义。
好的,既然你想要继续这条路,尽管其他回答者已经警告过你 :), 你可以复制并修改UPM detector来实现你需要的功能。
编写FindBugs探测器非常简单(特别是当你有一个很好的起点时)。阅读this以帮助你入门。
截至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远非完美,但它仍然是一个相当有用的工具。
对我来说,找到未使用方法的最佳方法是使用覆盖率工具,例如emma。
对应用程序进行仪器化,过度使用并检查emma日志 - 在会话期间未使用的方法可能未被使用,您可以使用您喜欢的IDE(eclipse,...)来检查未访问的方法调用层次结构。
我怀疑,发现错误或任何其他代码分析器是否真正能够检测未使用的方法,因为方法可能会:
删除未使用的代码(包括未使用的公共方法)是混淆器的一项功能。问题在于,仅通过查看包含它的类,你无法确定公共方法是否被使用。你需要查看整个将要运行的系统,因为公共方法可能从任何地方调用。
对整个系统(即你的代码和所有用于运行系统的库)运行混淆器可以帮助找到从未被调用的公共方法(注意:反射当然会影响结果!)。