我通过将一些静态方法调用更改为非静态调用来重构一些Java代码以使其更加分离,例如:
// Before:
DAO.doSomething(dataSource, arg1, ..., argN)
// After:
dao.doSomething(arg1, ..., argN)
我的问题是,在大型项目中,很难找到静态方法调用的位置。有没有一种简单的方法可以从命令行或在Eclipse中执行此操作?
这样的工具需要让我忽略“良性”静态方法调用,例如这些(通过首先找不到它们,或者允许它们从搜索结果中轻松删除):
String.valueOf(...)
Integer.parseInt(...)
MyClass.someBenignStaticMethod(...)
一些澄清:
答案 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。写这样的扩展似乎很容易。