Как динамически генерировать код с аннотациями во время сборки в Java?
Я ищу решение для генерации кода. Я googled, искал на SO и некоторые блоги, но я не нашел хорошего решения.
Я хотел бы поместить аннотацию в мой класс и во время компиляции, некоторые методы и свойства будут автоматически добавлены в класс.
Ключевые моменты решения, которое я ищу:
- Сгенерированный код настраиваемый (ОБЯЗАТЕЛЬНЫЙ)
- Не нужно вызывать внешний инструмент, например
apt
(MANDATORY)
- Только 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:
Наконец, я перевел свое третье требование с MANDATORY на OPTIONAL и выбрал проект Lombok (простая интеграция с Maven и Eclipse, практически никакой работы
для его использования).
Ответы
Ответ 1
Посмотрите Проект Ломбок. Он генерирует код, который вы задаете при написании:
public class MyClass {
@Getter @Setter private String alias;
}
Он также делает намного больше, если вам это нужно. Я знаю, что вы не запрашивали никаких внешних инструментов, но в основном вы воссоздаете это.
Ответ 2
Инструмент обработки аннотации был интегрирован в javac с версии 1.6 и часть JDK. Таким образом, нет необходимости в внешних инструментах при использовании API-интерфейса Pluggable Annotation. Вы можете генерировать любой код, анализируя пользовательские аннотации или объявления метода/параметра/поля/класса, используя Mirror API.
Однако вы не можете/не должны менять существующие классы. Методы расширения могут быть созданы путем создания подклассов.
Ответ 3
Я использую XML и XSLT для генерации кода. Он используется для EJB, Logic и CRUD части представлений. Это не выполняется во время выполнения, а вместо этого на сервере buildserver. Разработчики могут генерировать код вручную для целей разработки скважины. Это делается с помощью той же команды ANT, используемой на сервере buildserver.
Поскольку поколение с XML и XSLT, оно очень настраивается.
Если вы google Java code generation with XSLT
, вы столкнетесь с множеством примеров. Обратите внимание, что этот метод датируется ~ 2000 и, вероятно, теперь ему предшествуют более простые решения.