Можете ли вы сгенерировать код, переопределяющий метод, используя аннотации Java?
Можно ли написать аннотацию Java для класса, который генерирует метод, который переопределяет родительский метод класса?
В моем случае я хочу сделать это в Android:
@OverrideOnTouch
class Foo extends Activity {
И он сгенерирует метод переопределения onTouch во время компиляции.
Является ли это возможным?
1 ответ
Аннотация не может генерировать код.
Вы можете написать обработчик аннотаций, который добавляет метод во время компиляции, где бы он ни находил вашу аннотацию.
Вот учебник на эту тему:
Тем не менее, имейте в виду, что написание процессора аннотаций - это значительный объем работы по программированию на Java. Также обратите внимание, что процессор аннотаций (реализован с использованием AnnotationProcessor
API и вызывается через компилятор Java) не может изменить исходный код Java. Он может генерировать только новые файлы ".java".
Итак, если вы хотите внедрить новый метод в существующий класс, вам нужно скомпилировать класс, а затем использовать процессор аннотаций после компиляции, который использовал BCEL или эквивалентный, чтобы добавить необходимые методы в файлы ".class", созданные компилятор. Реализация процессора на основе BCEL... еще сложнее. И такие процессоры имеют тенденцию ломаться при обновлении Java. (Легко сделать предположения о реализации уровня JVM / уровня байт-кода, которые не поддерживаются соответствующими спецификациями... и больше не "работают" при изменении платформы.)
Этот подход упоминается в некоторых ответах на этот вопрос: