Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Java как генерировать код, в зависимости от аннотаций

#java #generate


Мне стало интересно, а при помощи чего можно генерировать код в методах, описывая,
что генерировать аннотациями?



К примеру, есть библиотека Lombok, которая генерирует код, в зависимости от аннотаций.
Есть аннотация @NonNull, которая применяется вот так:

void method(@NonNull Object arg)  {}


И она генерирует проверку, что-то вроде:

if (arg == null) 
    throw new NullPointerException();


Но, порывшись в исходниках библиотеки, я понял, что ничего не понял. 



Собственно вопрос: а как это так можно генерировать код, беря любые поля класса/метода
на стадии компиляции? 
    


Ответы

Ответ 1



Lombok основан на annotation processing. Для генерации кода используется cglib. Но сам jsr 269 не предполагает изменение байткода компилируемых классов. Он предоставляет механизм только для создания новых классов, анализа существующих и пр. Поэтому lombok опирается на внутренние классы компилятора, совместимость которых между версиями не гаратируется, отчасти там такой, несколько запутанный, код.

Комментариев нет:

Отправить комментарий