[英]Automatically remove explicit package declarations with import statements in Java
我有一個由其他人創建的項目,其中包含數千個類文件,並且對於任何類的每個引用都明確鍵入了包名稱。 看起來代碼是逆向工程的。 是否有一個很好的Java工具可以重構代碼,以便從類引用中刪除顯式類型的包前綴並將其移動到import語句中。
先感謝您。
編輯:
我想一個例子會有所幫助。 我想把進口放在最頂層,我不關心有多少進口。
javax.swing.JButton button1 = new javax.swing.JButton();
想象一下上面的代碼,但在成千上萬的類文件中成千上萬行代碼中絕對無處不在。 我希望能夠刪除所有的前綴,只是有一個很好的導入javax.swing.JButton; 在每個類文件的頂部。
我不知道這個用例的工具,但幾個月前我不得不做類似的事情。
編寫腳本或使用正則表達式執行搜索替換以刪除顯式類型的包前綴。
比使用“組織導入”讓eclipse完成剩下的工作。 按Ctrl-1
提示:為避免歧義,請使用不超過所需庫的類路徑設置類路徑。 對於大約800個課程,我在2小時內完成。
編輯:您應該知道在Prefeneces / Java / Editor / Save Actions中,可以將Organize導入配置為保存操作。
對於單一類型,eclipse提供“添加導入”操作(Shift + Ctrl + M)。 它完全符合您的要求 - 具有很大的限制:您必須將光標放在類型上,它只會影響該“選定”事件。
但也許這個動作可以用在腳本/全局方法中。 JDT插件可以爬過AST並在它找到的每種類型上調用此操作。
我使用Michael Ernst的Eclipse插件來做你想要的。 它把如引用java.util.Collection
,以Collection
與添加的import java.util.Collection;
在文件的頂部。
它實際上與使用“Source - > Add Import”作為完全限定的引用是一回事,除了它允許您一次完成整個.java文件。
更好的是,它允許您批量處理在Package Explorer中選擇的所有.java文件。 只需右鍵單擊選擇,然后從上下文菜單中選擇“源 - >清除限定類型聲明”。
Eclipse更新站點: http : //cqtp.sourceforge.net/eclipse/
IntelliJ Idea具有基於每個文件執行此操作的工具。 你也可以批量做,但我不知道怎么做。
嘗試30天的評估,您可能會對導入清理功能感到高興。
我對軸生成的文件有同樣的問題,我寫了一個小的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)
}
}
}
通過在目標文件上運行下面的sed命令,然后在eclipse中重新組織導入,我已經能夠刪除接口中的所有顯式包名:
sed -e 's/java\.[^ ]*\.//g;s/com\.[^ ]*\.//g'
您可能需要替換所有javax.swing.
。 然后組織進口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.