2008-10-02 1 views
11

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

Label l = new Label("Cat"); 

бы стать:

Label l = new Label(Constants.CAT); 

И в Constants.java я бы:

public final static String CAT = "Cat"; 

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

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

+0

«наш клиентский код использует GWT, который не поддерживает механизм текстовых файлов Java-свойств»: это просто неверно ... Это правда, вы не можете загрузить файл свойств * напрямую * с клиентской стороны, но клиент может сделать асинхронный вызов на сервер, и сервер может отправить обратно объект Properties (или данные в любой форме, в которой вы нуждаетесь). Вы * можете * использовать файлы свойств на стороне клиента, вам нужно пройти еще один или два шага. – 2013-11-14 13:42:50

ответ

9

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

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

Полный пример можно найти в этом eclipse corner article, а также более подробно в eclipse help.
И вы можете найти несколько примеров в Listing 5 of the section "Implementation of in-place translation" of Automating the embedding of Domain Specific Languages in Eclipse JDT, а также multiple examples in GitHub projects.

21

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

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

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

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

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

+0

Я уже проверил Eclipse, и он переместит всю строку в файл свойств txt, который затем загружается Message.getString(). Это не то, что я хочу сделать. Я просто хочу, чтобы моя строка играла старую java-константу. – 2008-10-02 01:44:32

+0

Это неплохая идея. После того, как вы их получите, вы можете искать эти шаблоны и заменять их тем, что хотите. – ykaganovich 2008-10-02 05:34:45

1

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

1

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

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

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

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

0

Возможно, вы захотите проверить Jackpot source transformation engine в NetBeans, который позволит вам создавать сценарии ваших исходных преобразований.

Смежные вопросы