如何在大型Java项目中找到静态方法调用?

时间:2009-10-06 01:40:57

标签: java eclipse find static-methods

我通过将一些静态方法调用更改为非静态调用来重构一些Java代码以使其更加分离,例如:

// Before:
DAO.doSomething(dataSource, arg1, ..., argN)

// After:
dao.doSomething(arg1, ..., argN)

我的问题是,在大型项目中,很难找到静态方法调用的位置。有没有一种简单的方法可以从命令行或在Eclipse中执行此操作?

这样的工具需要让我忽略“良性”静态方法调用,例如这些(通过首先找不到它们,或者允许它们从搜索结果中轻松删除):

String.valueOf(...)
Integer.parseInt(...)
MyClass.someBenignStaticMethod(...)

一些澄清:

  • 我对通过反射找到方法调用不感兴趣
  • 我不知道这个项目中目前存在哪些静态方法,所以它并不像使用Eclipse的“Open Call Hierarchy”命令(Ctrl-Alt-H)搜索其调用者那么简单,尽管这是一种简单的搜索方式非私有静态方法可以让我使用这种方法
  • 我也有兴趣找到位于我项目之外的静态方法的调用,例如: javax.mail.Transport#发送
  • 我正在寻找免费(如啤酒)解决方案

6 个答案:

答案 0 :(得分:3)

你真的需要搜索吗?为什么不逐个注释静态方法调用?当你编译它然后它将清除引用。

答案 1 :(得分:1)

我会使用grep(Linux上的-R)来搜索初始的caps-dot-camel case-open(我不会用它来给你完整的命令行)。然后grep -v摆脱一些垃圾。

嗯,我真的要做的是逐步重构。更改方法,看看有什么中断(如果没有中断,删除代码)。

理论上,您可以搜索查找invokestatic的类文件。 FindBugs基础设施可能会有所帮助(可能有更好的起点)。

答案 2 :(得分:1)

某些IDE为重构提供支持。您可以逐个重构每个静态方法。

在Eclipse中,您可以查看调用层次结构以查看此方法的所有调用方。要查看调用层次结构,您可以选择方法名称并按Command-Alt-H,或右键单击符号并选择“打开调用层次结构”。

答案 3 :(得分:1)

我们有一款名为nWire for Java的产品可能会有所帮助。 nWire分析您的代码并构建代码组件和关联的数据库。您可以在我们的网站上看到一个简短的演示。

我们计划在未来添加报告功能。同时,如果您对数据库有一些基本经验,则可以使用nWire存储库,并使用简单的SQL查询获取所有静态方法的列表(您还可以在其中查看调用)。 nWire使用开源且免费的H2 database引擎。

我可以协助访问数据库。请给我一行支持[at] nwiresoftware.com。

答案 4 :(得分:1)

我编写了一个使用优秀ASM库的小型Java程序。它允许您排除像java.lang这样的包,并生成如下所示的输出:

+ java
  + io
    - File
      # createTempFile(java.lang.String, java.lang.String)
+ javax
  + imageio
    - ImageIO
      # read(java.io.InputStream)
      # write(java.awt.image.RenderedImage, java.lang.String, java.io.File)
  + mail
    - Transport
      # send(javax.mail.Message)
    + internet
      - InternetAddress
        # parse(java.lang.String, boolean)
  + xml
    + parsers
      - DocumentBuilderFactory
        # newInstance()

我更喜欢在我现有的构建过程中使用CheckStyle更容易构建的东西,但这是我迄今为止提出的最佳解决方案。

答案 5 :(得分:0)

可能的解决方案可能是自定义CheckSyle或PMD或...警告。目前我遇到了同样的挑战,并尝试使用CheckStyle。写这样的扩展似乎很容易。