#java #generate
Мне стало интересно, а при помощи чего можно генерировать код в методах, описывая,
что генерировать аннотациями?
К примеру, есть библиотека Lombok, которая генерирует код, в зависимости от аннотаций.
Есть аннотация @NonNull, которая применяется вот так:
void method(@NonNull Object arg) {}
И она генерирует проверку, что-то вроде:
if (arg == null)
throw new NullPointerException();
Но, порывшись в исходниках библиотеки, я понял, что ничего не понял.
Собственно вопрос: а как это так можно генерировать код, беря любые поля класса/метода
на стадии компиляции?
Ответы
Ответ 1
Lombok основан на annotation processing. Для генерации кода используется cglib. Но сам jsr 269 не предполагает изменение байткода компилируемых классов. Он предоставляет механизм только для создания новых классов, анализа существующих и пр. Поэтому lombok опирается на внутренние классы компилятора, совместимость которых между версиями не гаратируется, отчасти там такой, несколько запутанный, код.
Комментариев нет:
Отправить комментарий