Извлечь всю строку из java-проекта

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

Label l = new Label("Cat");

Станет:

Label l = new Label(Constants.CAT);

А в Constants.java у меня было бы:

public final static String CAT = "Cat";

Я не хочу, чтобы строки выводились в текстовый файл свойств.
Одна из причин - согласованность и удобочитаемость кода. Во-вторых, наш клиентский код использует GWT, который не поддерживает механизм текстового файла свойств Java.

Я мог бы написать какой-нибудь парсер (возможно, используя задачу замены муравья)?
Но мне было интересно, а IDE уже делает такие вещи автоматически.

"наш клиентский код использует GWT, который не поддерживает механизм текстового файла свойств Java": это просто неправда ... Это правда, вы не можете загрузить файл свойств напрямую со стороны клиента, но клиент может выполнить асинхронный вызов на сервер, и сервер может отправить обратно объект Properties (или данные в любой нужной вам форме). Вы может используете файлы свойств на стороне клиента, вам нужно пройти еще один или два шага.

Brian Pipa 14.11.2013 17:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
12
1
8 667
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Eclipse делает это автоматически. Щелкните файл правой кнопкой мыши, выберите «Источник», затем «Вывести строки из внешнего источника».

Это не совсем то, что вы просили (наличие строк в файле Constants.java в виде строк), но используемый метод действительно очень мощный. Он перемещает их в файл свойств, который может загружаться динамически в зависимости от вашего языкового стандарта. Наличие их в отдельном исходном файле Java, как вы предлагаете, означает, что в вашем приложении будут либо ВСЕ языки одновременно, либо вы будете поставлять разные приложения в зависимости от локали.

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

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

Все, что вам затем нужно сделать, это изменить класс Accessor, чтобы использовать встроенные строки (в отдельном классе), а не загружать их во время выполнения.

Я уже проверил Eclipse, и он переместит всю строку в файл свойств txt, который затем загружается с помощью Messages.getString (). Я не хочу этого делать. Я просто хочу, чтобы моя строка воспроизводила старую константу Java.

Thierry-Dimitri Roy 02.10.2008 05:44

Это неплохая идея. Как только они у вас появятся, вы можете искать эти шаблоны и заменять их тем, что вам нужно.

ykaganovich 02.10.2008 09:34

Кроме того, этот метод не распознает одну и ту же строку в одном проекте. Я хочу, чтобы все экземпляры «Cat» указывали на Constants.CAT

Thierry-Dimitri Roy 02.10.2008 19:07

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

Я полностью согласен с тем, что сказал Пакс Дьябло. Мы тоже используем эту функцию.

При применении к файлу класса функция «Externalize strings» создает два файла: класс Messages.class и файл свойств messages.properties. Затем он перенаправит все прямые случаи использования строковых литералов на вызов Messages.get (строковый ключ) и будет использовать ключ, который вы ввели для строки в мастере «Ext. String».

BTW: Что плохого в файлах свойств? По его словам, вы можете просто изменить файл свойств и не менять класс, если вам нужно изменить текст.

Еще одно преимущество заключается в следующем: способ извлечения строковых литералов в файл свойств позволяет вам переводить исходный язык на любой язык, который вы хотите без изменения кода. Загрузчик файла свойств автоматически загружает файл целевого языка, используя соответствующий файл с ISO-кодом языка. Таким образом, вам не нужно беспокоиться о платформе, на которой работает ваш код, он выберет соответствующий язык (почти) автоматически. См. Документацию класса ResourceBundle, чтобы подробно узнать, как это работает.

Вы можете проверить Механизм преобразования источника джекпота в NetBeans, который позволит вам создавать сценарии преобразования исходного кода.

Ответ принят как подходящий

Чтобы завершить ответ Питера Келли, вы можете рассмотреть для Eclipse IDE решение AST.

Затем вы можете написать программу AST, которая анализирует ваш исходный код и делает то, что вы хотите.

Полный пример доступен в этом затмение угловой артикль, также более подробная информация в помощь по затмению.
И вы можете найти несколько примеров в Листинг 5 раздела «Реализация перевода на месте» Автоматизация встраивания доменных языков в Eclipse JDT, рядом с несколько примеров в проектах GitHub.

@Roy, пожалуйста, поделитесь результатом. Даже я ищу то же самое. Было бы очень полезно, если бы вы могли поделиться им

Ravisha 08.02.2012 09:08

Ссылка на презентацию @VonC не работает !!

ahmednabil88 22.12.2013 23:26

@YajliMaclo Точно, эта презентация больше не доступна. Вместо этого я привел новые примеры.

VonC 23.12.2013 02:01

Другие вопросы по теме