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