【问题标题】:Can findbugs detect unused public methodsfindbugs 可以检测未使用的公共方法吗
【发布时间】:2011-06-10 21:43:52
【问题描述】:

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

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

【问题讨论】:

  • 我知道您可以使用 IntelliJ(免费版)(以及自动删除)。它有超过 650 次检查。我认为您可以通过查找错误来做到这一点。
  • 谢谢彼得,但我被 Eclipse 困住了 :(

标签: java findbugs public-method


【解决方案1】:

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

https://github.com/mebigfatguy/deadmethods

【讨论】:

    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我还遇到了ucdetector.org,声称可以完成这项工作,但我还没有尝试过。
    【解决方案4】:

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

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

    【讨论】:

    • 是的,我找到了一些可以做到这一点的混淆器,我对使用 FindBugs 特别感兴趣。
    【解决方案5】:

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

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

    【讨论】:

    • 谢谢瑞恩。我刚开始使用 FB,没有扩展检测器的经验,因此感谢您的链接。但是为公共方法扩展 UPM 并不容易——被调用的方法和所有方法都必须存储在项目级别。你能指点我一下这样的探测器吗?
    • 好问题,如果我戴着我的黑客代码帽,我会告诉你你尝试为此使用静态变量,因为我只是在一个 jvm 上运行 findbugs 而我'我很确定我不会面对任何类加载器地狱。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

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

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

      • 由其他库调用(适用于所有非私有方法)
      • 远程调用
      • 通过反射 API 调用(甚至是私有方法,从技术上讲)

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

        • 德里克你回答了你自己的问题:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2013-01-13
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多