Что является маркером для синтаксического анализатора при обработке аннотаций?
Что проверяют
Понимаете ли вы, что аннотация это метаданные, у которых три разных потребителя: компилятор при разборе исходника, обработчик аннотаций во время компиляции и рефлексия во время выполнения. Формулировка размытая, и сильный ответ начинается с уточнения, про какой из этапов речь.
Как отвечать
На уровне грамматики маркер один: символ @ перед именем типа. Компилятор разбирает конструкцию, проверяет, что такой тип аннотации существует и что место применения разрешено, и кладёт её в дерево разбора. Никакого поведения при этом не появляется, аннотация остаётся данными.
Что будет дальше, задают две мета-аннотации. @Target перечисляет допустимые места: класс, метод, поле, параметр, тип. @Retention определяет судьбу:
SOURCE: доступна компилятору и обработчикам, в класс-файл не попадает.CLASS: попадает в класс-файл, но через рефлексию не видна. Это вариант по умолчанию.RUNTIME: доступна через рефлексию, именно на неё опираются фреймворки.
В класс-файле аннотации лежат отдельными атрибутами, видимыми и невидимыми для среды выполнения, а не внутри тела метода.
Для обработчика аннотаций маркер другой: набор типов, который он объявляет через @SupportedAnnotationTypes. Компилятор идёт раундами и передаёт обработчику элементы, помеченные этими типами, а сгенерированный код становится входом следующего раунда.
Стоит назвать и термин: маркерная аннотация это аннотация без элементов, которая не несёт ничего, кроме самого факта наличия.
Где спотыкаются
Думают, что аннотация сама что-то делает. Без обработчика, рефлексии или правки байткода она не меняет ровно ничего, и это первое, что проверяют уточняющим вопросом.
Путают @Target и @Retention. Первая отвечает на вопрос, куда её можно поставить, вторая на вопрос, до какого этапа она доживёт, и ошибка вылезает как пустой результат поиска аннотации во время выполнения.
Считают, что обработчик правит существующие классы. Штатный механизм порождает новые исходники и ресурсы, а изменение уже разобранного дерева это трюк с внутренними интерфейсами компилятора, который ломается при смене версии.