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

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

Label l = new Label("Cat");

Стало бы:

Label l = new Label(Constants.CAT);

И в Constants.java я бы:

public final static String CAT = "Cat";

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

При применении к файлу класса функция "Внешние строки" создаст два файла, класс Message.class и файл свойств messages.properties. Затем он перенаправляет все прямые использования строковых литералов на вызов Message.get(String key) и использует ключ, введенный для строки в мастере "Ext. String".

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

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