我重构一些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#发送
- 我正在寻找一个免费的(如啤酒)解决方案
但是,您如何知道调用该方法的实例名称?你是否说每个K类都有一个范围内的实例k? – 2009-10-06 03:32:21
不,发现了一个不需要的静态方法调用,我会重构将其删除,例如通过使用DI来注入包含静态方法的类的实例。但这完全在问题的范围之外;现在我只想找到这样的静态方法调用。 – 2009-10-06 03:43:25
在这种情况下,javap和grep invokeStatic应该让你去。我曾经用过这个awk来创建像数据一样的cflow。 – 2009-10-06 04:33:37