簡體   English   中英

使用Java中的import語句自動刪除顯式包聲明

[英]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並在它找到的每種類型上調用此操作。

這個帖子說:

選擇包瀏覽器視圖,右鍵單擊您的項目,選擇源然后組織導入。 把你的叔叔丟掉 - 所有不需要的進口都被刪除了

為了更好地格式化:

Right click project > Source > Organize imports

現在,剩下的就是找到一種從代碼中剝離完全限定名稱的方法。 你可能會想到一些正則表達式。 看看這個圖書館 - 看起來很有幫助。 這篇文章也應該有用。

我使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM