Извлечь всю строку из проекта Java - PullRequest
12 голосов
/ 02 октября 2008

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

Label l = new Label("Cat");

станет:

Label l = new Label(Constants.CAT);

А в Constants.java я бы имел:

public final static String CAT = "Cat";

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

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

Ответы [ 5 ]

21 голосов
/ 02 октября 2008

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

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

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

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

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

9 голосов
/ 02 октября 2008

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

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

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

1 голос
/ 02 октября 2008

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

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

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

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

1 голос
/ 02 октября 2008

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

0 голосов
/ 02 октября 2008

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

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