Java findbugs能否检测未使用的公共方法
是否可以使用FindBugs检测源树中未使用的方法?我在SO上看到一些帖子,其中用户声称这样做,一些人询问如何在FB中这样做,还有一些人声称FB不能这样做Java findbugs能否检测未使用的公共方法,java,findbugs,public-method,Java,Findbugs,Public Method,是否可以使用FindBugs检测源树中未使用的方法?我在SO上看到一些帖子,其中用户声称这样做,一些人询问如何在FB中这样做,还有一些人声称FB不能这样做 有人知道这是怎么做到的吗?我只对没有从别处显式调用的方法感兴趣,我不关心反射 我认为Findbugs很有可能报告公共方法,而这些方法的使用方式与报告私有方法不同(要么是那样,要么我想到的是编译器标志:-) 真正的问题是,你为什么也想要?如果您正在编写一个已关闭且永远不会扩展的程序,那么查找未使用的方法将为您提供删除它们的机会。但是,如果你正在
有人知道这是怎么做到的吗?我只对没有从别处显式调用的方法感兴趣,我不关心反射 我认为Findbugs很有可能报告公共方法,而这些方法的使用方式与报告私有方法不同(要么是那样,要么我想到的是编译器标志:-) 真正的问题是,你为什么也想要?如果您正在编写一个已关闭且永远不会扩展的程序,那么查找未使用的方法将为您提供删除它们的机会。但是,如果你正在编写一个API,你无法预测谁会需要这些方法,因此报告这些方法没有多大意义。对于我来说,为未使用的方法寻找候选方法的最佳方法是使用覆盖工具,如emma 为应用程序插入工具,过度使用它并检查emma日志-会话期间未使用的方法可能未使用,您可以使用您喜爱的IDE(eclipse…)检查未访问的方法调用层次结构 我怀疑,发现bug或任何其他代码分析器是否真的能检测到未使用的方法,因为方法可能是
- 由其他库调用(对于所有非私有方法)
- 远程呼叫
- 通过反射API调用(甚至私有方法,从技术上讲)
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还远远不够完美,但它仍然是一个非常有用的工具。好吧,既然你想走这条路,尽管其他人发出警告:),你可以复制和修改它来做你需要的事情 为FindBugs编写检测器非常简单(特别是当您有了一个很好的起点时)。阅读入门删除未使用的代码(包括未使用的公共方法)是一件事。问题是,您不能仅仅通过查看包含公共方法的类来判断是否使用了该方法。您需要查看将要运行的整个系统,因为可能会从任何地方调用公共方法
对整个系统(即,您的代码和用于运行系统的所有库)运行模糊处理程序有助于找到从未调用过的公共方法(注意:反射当然会影响结果!)。也许crap4j正是您所需要的。它将删除单元测试未达到的所有代码。这当然是最小化你的应用程序的艰难之路。作为FindBugs团队的一员,我可以告诉你,不幸的是FindBugs没有做到这一点。如果你在我们的网站上搜索,唯一提到的“未使用的”检测器是未使用的字段。我有一个项目,我目前正在做这个。。。。现在还很早,所以可能会留下一堆bug:
我知道您可以使用IntelliJ(免费版)(以及自动删除)。它有650多次检查。我想你可以用find bugs来做这件事。谢谢Peter,但我被Eclipse困住了:(Derek你回答了你自己的问题:)是的,我发现了一些模糊器可以做到这一点,我特别对使用FindBugs感兴趣。谢谢Ryan。我刚开始使用FB,没有扩展探测器的经验,所以感谢链接。但是为公共方法扩展UPM并不容易——被调用的方法和所有方法都必须存储在项目级别。你能告诉我任何这样的检测器吗?好问题,如果我戴着我的黑客代码帽,我会告诉你你尝试使用一个静态变量,因为我只是在一个jvm上运行findbugs,我很确定我不会面临任何类加载器的地狱。我还遇到了一个声称做这项工作的,但是我还没有试过。这个答案有点过时了。链接已更改为,并且有专用方法的规则: