Подтвердить что ты не робот

Автоматически удалять явные объявления пакетов с помощью операторов импорта в Java

У меня есть проект, созданный другими, который включает в себя тысячи файлов классов и имеет имена пакетов, явно напечатанные для каждой ссылки на любой из их классов. Похоже, что код был обратным. Есть ли хороший инструмент для Java, который реорганизует код, чтобы явные типизированные префиксы пакетов удалялись из ссылок на классы и перемещались в операторы импорта.

Спасибо заранее.

EDIT:

Я думаю, что пример поможет. Я хочу, чтобы импорт был наверху, и мне все равно, сколько импортеров.

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

Представьте код выше, но абсолютно везде в тысячах и тысячах строк кода среди тысяч файлов классов. Я хотел бы иметь возможность удалить все префиксы и просто иметь хороший импорт javax.swing.JButton; в верхней части каждого файла класса.

4b9b3361

Ответ 1

Я не знаю инструмента для этого варианта использования, но мне нужно было сделать что-то подобное несколько месяцев назад.

  • Напишите script или замените поиск с помощью регулярного выражения, чтобы избавиться от явно набранных префиксов пакетов.

  • Чем затмение сделает все остальное, используя "организовать импорт". Ctrl-1

Подсказка: чтобы избежать двусмысленностей, настройте путь к классам не более, чем требуемые библиотеки. Для около 800 классов я закончил через 2 часа.

  • Или получить того, кто заслужил это, чтобы выполнить эту работу.

EDIT: вы должны знать, что в Prefeneces/Java/Editor/Save Actions, Organize import можно настроить как действие сохранения.

Ответ 2

Для одного типа eclipse предлагает действие "Добавить импорт" (Shift + Ctrl + M). Он делает именно то, что вы хотите - с большим, большим ограничением: вы должны поместить курсор на тип, и это повлияет только на это "выбранное" появление.

Но возможно это действие может быть использовано в сценарии/глобальном методе. Плагин JDT мог сканировать через AST и вызывать это действие на каждом найденном ему типе.

Ответ 3

Этот поток говорит:

выберите представление проводника пакета, щелкните правой кнопкой мыши на своем проекте, выберите источник, а затем организуйте импорт. Боб вашего дяди - все нежелательные импорт удаляются

Чтобы сделать его более форматированным:

Right click project > Source > Organize imports

Теперь, что остается, нужно найти способ лишить полностью квалифицированные имена из кода. Вы можете думать о некотором регулярном выражении. Взгляните на эту библиотеку - это кажется полезным. Эта статья также должна быть полезна.

Ответ 4

Я использую плагин Eclipse от Michael Ernst, который делает то, что вы хотите. Он преобразует ссылки, такие как java.util.Collection в Collection с добавлением import java.util.Collection; в начало файла.

Это фактически то же самое, что использовать "Источник → Добавить импорт" для полностью квалифицированной ссылки, за исключением того, что он позволяет вам делать это для всего .java файла сразу.

Еще лучше, он позволяет вам пакетно обрабатывать все .java файлы, которые вы выбрали в Проводнике пакетов. Просто щелкните правой кнопкой мыши по выбору и выберите "Источник → Очистить квалифицированные декларации типа" в контекстном меню.

Сайт обновления Eclipse: http://cqtp.sourceforge.net/eclipse/

Ответ 5

В IntelliJ Idea есть инструменты для этого для каждого файла. Возможно, вы также можете сделать это навалом, но я не знаю, как это сделать.

Попробуйте провести 30-дневную оценку, и вам, вероятно, понравится больше, чем функции очистки импорта.

Ответ 6

У меня была такая же проблема с файлами сгенерированных осей, и я написал небольшой groovy script для этого. Я не делаю все (вы должны использовать организовывать импорт в 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)
  }
 }
}

Ответ 7

Вероятно, вам нужно заменить все javax.swing.. Затем организуйте импорт.

Ответ 8

Я смог удалить все явные имена пакетов в интерфейсах, выполнив команду sed ниже в целевых файлах, а затем реорганизовывая импорт в eclipse:

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