使用Java中的import语句自动删除显式包声明

我有一个由其他人创建的项目,其中包含数千个类文件,并且对于任何类的每个引用都明确键入了包名。 看起来代码是逆向工程的。 是否有一个很好的Java工具可以重构代码,以便从类引用中删除显式类型的包前缀并移入import语句。

先谢谢你。

编辑:

我想一个例子会有所帮助。 我想把import放在最顶层,我不关心有多少import。

javax.swing.JButton button1 = new javax.swing.JButton(); 

想象一下上面的代码,但绝对无处不在成千上万的类文件中成千上万行代码。 我希望能够删除所有的前缀,只是有一个很好的导入javax.swing.JButton; 在每个类文件的顶部。

我不知道这个用例的工具,但几个月前我不得不做类似的事情。

  • 编写脚本或使用正则表达式执行搜索替换以删除显式类型的包前缀。

  • 比使用“组织import”让eclipse完成剩下的工作。 按Ctrl-1

提示:为避免歧义,请使用不超过所需库的类路径设置类路径。 对于大约800个课程,我在2小时内完成。

  • 或者让一个应该得到这份工作的人。

编辑:您应该知道在Prefeneces / Java / Editor / Save Actions中,可以将组织导入配置为保存操作。

对于单一类型,eclipse提供“添加导入”操作(Shift + Ctrl + M)。 它完全符合您的要求 – 具有很大的限制:您必须将光标放在类型上,它只会影响该“选定”的出现。

但也许这个动作可以用在脚本/全局方法中。 JDT插件可以爬过AST并在它找到的每种类型上调用此操作。

这个post说:

选择包浏览器视图,右键单击您的项目,选择源然后组织导入。 把你的叔叔丢掉 – 所有不需要的import都被删除了

为了使其格式更好:

Right click project > Source > Organize imports

现在,剩下的就是找到一种从代码中剥离完全限定名称的方法。 你可能会想到一些正则表达式。 看看这个图书馆 – 看起来很有帮助。 这篇文章也应该有用。

我使用Michael Ernst的Eclipse插件来做你想要的。 它通过添加import java.util.Collection;等引用转换为Collection import java.util.Collection; 在文件的顶部。

它实际上与使用“Source – > Add Import”作为完全限定的引用是一回事,除了它允许您一次完成整个.java文件。

更好的是,它允许您批量处理在Package Explorer中选择的所有.java文件。 只需右键单击选择,然后从上下文菜单中选择“源 – >清除限定类型声明”。

Eclipse更新站点: http : //cqtp.sourceforge.net/eclipse/

IntelliJ Idea具有基于每个文件执行此操作的工具。 你也可以批量做,但我不知道怎么做。

尝试30天的评估,您可能会对导入清理function感到高兴。

我对轴生成的文件有同样的问题,我写了一个小的groovy脚本来做到这一点。 我没有做任何事情(你必须在运行后使用eclipse中的组织导入),而且我没有很好地测试它,所以要小心使用它。 它也仅限于小写包名和驼峰类名,但它可能是一个很好的起点

 def replaceExplicitPackageNamesInFile(File javaFile){ eol = org.codehaus.groovy.tools.Utilities.eol() newFile = "" explicitImportExpr = /([^\w])(([a-z0-9]+\.)+)([AZ][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) } } } 

您可能需要替换所有javax.swing. 。 然后组织import。

我已经能够通过在目标文件上运行下面的sed命令来删除接口中的所有显式包名,然后通过在eclipse中重新组织导入:

 sed -e 's/java\.[^ ]*\.//g;s/com\.[^ ]*\.//g'