Могу ли я добавить метод в класс из аннотации времени компиляции?

Если я создаю пользовательскую аннотацию (пример: @SaveFuncName("saveMe") добавит метод с именем saveMe() с некоторым кодом, который генерирует мой процессор), может ли компилятор javac использовать мой процессор аннотаций для добавления метода в класс? Или я могу только создать другой класс?

1 ответ

Или я могу только создать другой класс?

Правильно. Существующий API не позволяет нам изменять существующие классы, просто генерировать новые.

С технической точки зрения, если вы хотите сделать что-то хакерское, можно использовать внутренний Javac API для прямой модификации абстрактного синтаксического дерева, но это не для слабонервных. Например, объект типа TypeElement на самом деле символ непосредственно от Javac, скрытый от нас интерфейсом. Дерево синтаксиса также доступно в режиме только для чтения через API дерева компилятора. Мы можем отбросить интерфейсы и изменить код таким образом. Так работает, например, Project Lombok.

(Но я не могу рекомендовать это делать. Я в основном объясняю это, потому что Lombok - это вещь, которая существует, и похоже, что изменение классов возможно.)

Самые простые решения - создать суперкласс, например, с помощью saveMe() методы и расширять его или генерировать служебный класс и делегировать ему. (Также предлагается здесь.)

Другие вопросы по тегам