Страницы

Поиск по вопросам

воскресенье, 7 апреля 2019 г.

Аннотация в Java EE

Всем привет. Хотел узнать у знающих, что такое аннотации, и зачем они нужны. До того как начал изучать Java EE у меня было представление, что я знаю, что это такое. Но как дошел до Java EE, увидел, что они применяются везде особенно в JAX-RS и при написании веб сервисов.
Зашел в документацию прочитать про @Context и посмотреть что там внутри. Вот то, что увидел, если кто сможет объяснить синтаксис и саму логику данного кода буду признателен. Если есть ссылки на объяснение буду рад почитать.
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Context { }


Ответ

Это просто объявление аннотации без какой-либо логики. Как объявить аннотацию, рассказывается в любом учебнике по Java.
По-порядку:
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
Аннотация @Target, объявляет элементы исходного кода, к которым можно применить создаваемую аннотацию. В данном случае это: параметры методов (ElementType.PARAMETER), сами методы (ElementType.METHOD) и поля классов (ElementType.FIELD).
@Retention(RetentionPolicy.RUNTIME)
Аннотация @Retention, говорит компилятору, как долго нужно хранить аннотацию в коде. Политика RetentionPolicy.RUNTIME заставляет компилятор сохранить аннотации в .class-файлах и делает их доступными во время выполнения программы через рефлексию.
@Documented
Аннотация @Documented включает создаваемую аннотацию в список элементов исходного кода, для которых генерируется документация (при использовании инструментов генерации документации).
public @interface Context { }
Это, собственно, непосредственно объявление новой аннотации @Context

Сами по себе аннотации - просто маркеры, никакой работы они не выполняют.
Что касается логики ("магии") аннотаций то обычно это работает так: есть какой-то класс, отвечающий за инициализацию, он пробегает при помощи рефлексии по классам в определенном пакете и ищет какую-то аннотацию. Если находит - экземпляры этого класса подвергаются какой-либо обработке, например полям классов задаются некоторые значения.
В случае с JAX-RS "магией" занимается поставщик реализации (напр. CXF, Jersey, RESTEasy). Где-то в его недрах есть класс, который анализирует аннотации, которыми вы украсили ваши ресурсы и выполняет действия в соответствии со спецификацией JAX-RS. Например, составляет карту соответствий URL-ов конкретным методам, на основе аннотаций @Path и @GET/@PUT/@POST/@DELETE

Комментариев нет:

Отправить комментарий