Как генерировать код динамически с аннотациями во время сборки в Java? - PullRequest
23 голосов
/ 09 сентября 2011

Я ищу решение для генерации кода.Я гуглил, искал в SO и некоторых блогах, но не нашел хорошего решения.

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

Ключевые моменты решения, которое я ищу:

  • Сгенерированный код настраиваемый (ОБЯЗАТЕЛЬНО)
  • Нет внешнего инструмента, такого как apt естьбыть вызванным (ОБЯЗАТЕЛЬНО)
  • Только JDK, без сторонней структуры ( ОБЯЗАТЕЛЬНО ДОПОЛНИТЕЛЬНО)
  • Имя аннотации настраивается (ДОПОЛНИТЕЛЬНО)

Например:

@Aliasable
public class MyClass {
//Some properties

// Contructor ...

// Some methods
}

Мой класс выглядел бы так после компиляции:

public class MyClass {
   //Some properties
   private String alias;

   // Contructor ...

   // Some methods
   public String getAlias() {
      return alias;
   }

   public void setAlias(String alias) {
      this.alias=alias;
   }
}

РЕДАКТИРОВАТЬ:
Наконец, я перевел свое третье требование сОБЯЗАТЕЛЬНО ДОПОЛНИТЕЛЬНО и выбрал проект Lombok (простая интеграция с Maven и Eclipse, практически нет работы для его использования).

Ответы [ 3 ]

14 голосов
/ 09 сентября 2011

Инструмент обработки аннотаций был интегрирован в javac начиная с версии 1.6 и является частью JDK .Поэтому нет необходимости во внешних инструментах при использовании Pluggable Annotation API .Вы можете сгенерировать любой код, проанализировав пользовательские аннотации или объявления метода / параметра / поля / класса, используя Mirror API .

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

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

12 голосов
/ 10 сентября 2011

Взгляните на Project Lombok . Он генерирует код, который вы спрашиваете, когда пишете:

public class MyClass {
  @Getter @Setter private String alias;
}

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

3 голосов
/ 09 сентября 2011

Я использую XML и XSLT для генерации кода. Он используется для EJB, логики и CRUD-части представлений. Он не генерируется во время выполнения, а вместо этого на сервере сборки. Разработчики могут генерировать код вручную для целей разработки скважины. Это делается с помощью той же команды, которую ANT использует на сервере сборки.

Поскольку генерация выполняется с использованием XML и XSLT, она легко настраивается.

Если вы гуглите Java code generation with XSLT, вы натолкнетесь на множество примеров. Обратите внимание, что этот метод датируется ~ 2000 годом, и, вероятно, теперь ему предшествуют более простые решения.

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