我有一个由其他人创建的项目,其中包含数千个类文件,并且对于任何类的每个引用都明确键入了包名。看起来代码是逆向工程的。是否有一个很好的Java工具可以重构代码,以便从类引用中删除显式类型的包前缀并移入import语句。
提前谢谢。
修改
我认为一个例子会有所帮助。我想把进口放在最顶层,我不在乎有多少进口。
javax.swing.JButton button1 = new javax.swing.JButton();
想象一下上面的代码,但在成千上万的类文件中成千上万行代码中绝对无处不在。我希望能够删除所有的前缀,只是有一个很好的导入javax.swing.JButton;在每个类文件的顶部。
答案 0 :(得分:8)
我不知道这个用例的工具,但几个月前我不得不做类似的事情。
编写脚本或使用正则表达式执行搜索替换以删除显式类型的包前缀。
让eclipse使用“组织导入”完成剩下的工作。 CTRL-1
提示:为避免歧义,请使用不超过所需库的类路径设置。 对于大约800个课程,我在2小时内完成。
编辑:您应该知道在Prefeneces / Java / Editor / Save Actions中,可以将组织导入配置为保存操作。
答案 1 :(得分:5)
对于单一类型,eclipse提供“添加导入”操作(Shift + Ctrl + M)。它完全符合您的要求 - 具有很大的限制:您必须将光标放在类型上,它只会影响该“选定”事件。
但也许这个动作可以用在脚本/全局方法中。 JDT插件可以爬过AST并在它找到的每种类型上调用此操作。
答案 2 :(得分:2)
选择包浏览器视图,右键单击您的项目,选择源然后组织导入。将你的叔叔丢掉 - 删除所有不需要的进口
为了更好地格式化:
Right click project > Source > Organize imports
现在,剩下的就是找到一种从代码中剥离完全限定名称的方法。你可能会想到一些正则表达式。看看this library - 看起来很有帮助。 This article也应该有用。
答案 3 :(得分:2)
我使用Michael Ernst的Eclipse plugin做你想做的事。它会将java.util.Collection
等引用转换为Collection
,并在文件顶部添加import java.util.Collection;
。
与使用" Source - >实际上是一回事。添加导入"对于完全限定的引用,除了它允许您一次为整个.java文件执行此操作。
更好的是,它允许您批量处理在Package Explorer中选择的所有.java文件。只需右键单击选择,然后选择"来源 - >清洁合格的类型声明"形成上下文菜单。
Eclipse更新站点:http://cqtp.sourceforge.net/eclipse/
答案 4 :(得分:1)
IntelliJ Idea具有基于每个文件执行此操作的工具。你也可以批量做,但我不知道如何。
尝试30天的评估,您可能会对导入清理功能感到高兴。
答案 5 :(得分:1)
我对轴生成的文件有同样的问题,我写了一个小的groovy脚本来做这件事。我没有做任何事情(你必须在运行之后在eclipse中使用组织导入),而且我没有很好地测试它,所以要小心使用它。它也仅限于小写包名和驼峰类名,但它可能是一个很好的起点
def replaceExplicitPackageNamesInFile(File javaFile){
eol = org.codehaus.groovy.tools.Utilities.eol()
newFile = ""
explicitImportExpr = /([^\w])(([a-z0-9]+\.)+)([A-Z][a-zA-Z0-9]+)/
imports = ""
javaFile.eachLine {
line = it.replaceAll(explicitImportExpr, {
Object [] match ->
imports += "import ${match[2]+match[-1]};${eol}"
match[1]+match[-1]
})
newFile += line+"${eol}"
}
newFile2 = ""
newFile.eachLine { line ->
newFile2 +=
line.replaceAll(/(^\s*package.*$)/, {
Object [] match ->
match[0] + eol + imports
} ) + eol
}
javaFile.setText(newFile2)
}
def replaceExplicitPackageNamesInDir(File dir){
dir.eachFileRecurse {
if (it.isFile() && it.name ==~ /.*\.java\z/){
println "Processing ${it.absolutePath - dir.absolutePath}"
replaceExplicitPackageNamesInFile(it)
}
}
}
答案 6 :(得分:0)
您可能需要替换所有javax.swing.
。然后组织进口。
答案 7 :(得分:0)
我已经能够通过在目标文件上运行下面的sed命令来删除接口中的所有显式包名,然后在eclipse中重新组织导入:
sed -e 's/java\.[^ ]*\.//g;s/com\.[^ ]*\.//g'