2009-10-06 28 views
2

我重构一些Java代码来改变一些静态方法来更脱钩调用非静态调用,例如:如何在大型Java项目中查找静态方法调用?

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

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

我的问题是,在一个大的项目,它可以是很难找到正在进行静态方法调用。有没有简单的方法来做到这一点,无论是从命令行或在Eclipse?

这样的工具将需要(通过在首位没有找到它们,或让他们从搜索结果中轻松删除)让我忽略了“良性”的静态方法调用,如这些:

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

一些澄清:

  • 我没有兴趣在寻找通过反射
  • 我不知道是什么静态方法目前存在于这个项目取得方法调用,所以它不是为搜索一样简单该ir调用者使用Eclipse的“Open Call Hierarchy”命令(Ctrl-Alt-H),虽然搜索非私有静态方法的简单方法可以让我使用这种方法
  • 我也很感兴趣找到对静态方法的调用位于我的项目之外,例如javax.mail.Transport#发送
  • 我正在寻找一个免费的(如啤酒)解决方案
+0

但是,您如何知道调用该方法的实例名称?你是否说每个K类都有一个范围内的实例k? – 2009-10-06 03:32:21

+0

不,发现了一个不需要的静态方法调用,我会重构将其删除,例如通过使用DI来注入包含静态方法的类的实例。但这完全在问题的范围之外;现在我只想找到这样的静态方法调用。 – 2009-10-06 03:43:25

+0

在这种情况下,javap和grep invokeStatic应该让你去。我曾经用过这个awk来创建像数据一样的cflow。 – 2009-10-06 04:33:37

回答

1

我写了一个小型的Java程序,使用优秀的ASM库。它可以让你像排除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的,但是这是最好的解决办法到目前为止,我已经提出了。

1

我会用grep-R在Linux上)来搜索初始上限点驼病例打开(我没有用它来给你完整的命令行)。然后grep -v摆脱一些垃圾。

嗯,真的,我会做的是重构增量。更改方法,并查看什么是中断(如果没有中断,请删除代码)。

理论上你可以通过类文件搜索寻找invokestatic。 FindBugs基础结构可能会帮助你(可能有更好的起点)。

+0

我也考虑过FindBugs,但想必我会写我自己的检查模块(或者他们的插件被称为)? – 2009-10-06 02:34:12

+0

是的。距离我使用它已经两年半了,但我认为在这种情况下,它只是实现一对访客方法并注册插件。 – 2009-10-06 03:24:09

+0

你想要的东西像\ b [AZ] [\ w \。] + \。[az] \ w + \\( 我认为。 – wds 2009-10-06 09:57:26

3

你真的需要搜索吗?为什么不把静态方法调用逐个注释掉?当你编译它时,它会清除引用。

+0

这是有效的。但是,使用IDE时, – notnoop 2009-10-06 01:57:20

+0

如果静态方法被反射调用,该方法可能会丢失一些调用点 – 2009-10-06 02:07:05

+0

是的,但几乎没有静态分析来检测反射 – notnoop 2009-10-06 02:11:42

1

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

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

+0

问题是我不知道静态方法在哪里。所以你的回答首先要求我去寻找它们;如果可能的话,我希望直接搜索静态方法调用,因为它会更直接。 – 2009-10-06 02:16:58

1

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

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

我可以协助访问数据库。给我一条线来支持[在] nwiresoftware.com。

+0

谢谢,但我正在寻找非商业解决方案;我已经更新了相应的问题。 – 2009-10-07 00:45:27

+0

很酷。把价格贴上你的时间取决于你:-) – zvikico 2009-10-07 05:04:39

0

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

相关问题