Как динамически генерировать код с аннотациями во время сборки в Java?

Я ищу решение для генерации кода. Я гуглил, искал в 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;
   }
}

EDIT:
Наконец, я изменил свое третье требование с ОБЯЗАТЕЛЬНОГО на НЕОБЯЗАТЕЛЬНОЕ и выбрал проект Lombok (простая интеграция с Maven и Eclipse, практически ничего не нужно делать для его использования).


person Stephan    schedule 09.09.2011    source источник
comment
Я знаю, что это старо... но вы нашли хорошее решение этой проблемы? Некоторый код будет действительно оценен...   -  person Marco Castano    schedule 19.07.2017
comment
@MarcoCastano Пожалуйста, посмотрите мое редактирование.   -  person Stephan    schedule 19.07.2017
comment
О, хорошо, извините... по крайней мере, мне удалось создать код на основе аннотации во время компиляции.   -  person Marco Castano    schedule 19.07.2017


Ответы (3)


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

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

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

person jackrabbit    schedule 10.09.2011
comment
Ломбок действительно впечатляет. Но под ним действительно большая взлом. Может быть, этот хак ослабит его. - person Stephan; 12.09.2011
comment
Спасибо что подметил это. Я не знал, что он использует недокументированный API-интерфейс компилятора: notatube.blogspot .com/2010/11/ - person jackrabbit; 13.09.2011
comment
Для автора было важно не использовать сторонние библиотеки. - person Terel; 07.12.2016
comment
@Terel действительно, но помимо ОП этот ответ будет читать еще много людей (таких как вы). Возможно, они найдут это полезным. - person jackrabbit; 07.12.2016

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

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

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

person kapex    schedule 09.09.2011

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

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

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

person Benjamin Udink ten Cate    schedule 09.09.2011