Получение аннотаций во время выполнения с помощью рефлексии в Java

Получение аннотаций во время выполнения с помощью рефлексии в Java

Аннотации предназначены в основном для использования в инструментальных средствах разработки и развертывания прикладных программ на Java.

Но если они задают правило удержания RUNTIME, то могут быть опрошены во время вы­полнения в любой программе нa Java с помощью рефлексии.

Рефлексия — это языко­вое средство для получения сведений о классе во время выполнения программы.

Прикладной программный интерфейс (API) для рефлексии входит в состав пакета jаva.lang.reflect.

Пользоваться рефлексией можно самыми разными способа­ми. Обратимся к нескольким примерам применения рефлексии, имеющим отношение к аннотациям.

Первый шаг с целью воспользоваться рефлексией состоит в получении объек­та типа Class. Этот объект представляет класс, аннотацию которого требуется по­лучить.

А Class относится к числу встроенных в Java классов и определен в пакете java.lang.

Имеются разные способы получения объекта типа Class. Самый простой из них — вызвать метод getClass(), определенный в классе Object.

Его общая форма приведена ниже. Этот метод возвращает объект типа Class, который представляет вызывающий объект.

Обратите внимание на знаки <?>, следующие за именем Class в приведенном выше объявлении метода getClass(). Это обозначение имеет отношение к обобщениям в Java.

Имея в своем распоряжении объект типа Class, можно воспользоваться его методами для получения сведений о различных элементах, объявленных в классе, включая и его аннотацию.

Если требуются аннотации, связанные с определенны мэлементом, объявленным в классе, сначала следует получить объект, представляю­щий этот элемент.

Кто нибудь кодит на PHP? Как там обстоят дела с таким инструментом как рефлексия? У меня знакомый делает шаблоны под WordPress типа ThemeForest WoodMart говорит что никогда не использовал еще.

Например, класс Class предоставляет (среди прочего) методы getMethod(), getField() и getConstructor(), возвращающие сведения о мето­де, поле и конструкторе соответственно. Эти методы возвращают объекты типа Method, Field и Constructor.

Чтобы понять этот процесс, рассмотрим в качестве примера получение аннота­ций, связанных с методом. Для этого сначала получается объект типа Class, представ­ляющий класс, затем вызывается метод getMethod() для этого объекта с указанным именем искомого метода. У метода getMethod() имеется следующая общая форма:

Имя искомого метода передается в качестве аргумента имя_метода. Если этот метод принимает аргументы, то объекты типа Class, представляющие их типы, должны быть также указаны в качестве аргумента типы_параметров.

Обратите внимание на то, что аргумент типы_параметров представляет собой список ар­гументов переменной длины.

Это позволяет задать столько типов параметров, сколько требуется, в том числе и не указывать их вообще. Метод getMethod() воз­вращает объект типа Method, который представляет метод.

Если метод не удается найти, то генерируется исключение типа NoSuchMethodException.

Из объекта типа Class, Method, Field или Constructor можно получить кон­кретные аннотации, связанные с этим объектом, вызвав метод getAnnotation(). Его общая форма приведена ниже:

Здесь параметр тип_аннотации обозначает объект типа Class, представля­ющий требующуюся аннотацию. Этот метод возвращает ссылку на аннотацию.

Используя эту ссылку, можно получить значения, связанные с членами аннотации. Метод getAnnotation() возвращает пустое значение null, если аннотация не найдена.

В этом случае у искомой аннотации отсутствует аннотация @Retention, устанавливающая правило удержания RUNTIME.

Ниже приведен пример програм­мы, подытоживающий все сказанное выше. В этой программе рефлексия применяется для вывода аннотации, связанной с конкретным методом.

Ниже приведен результат, выводимый данной программой.

В этой программе рефлексия применяется, как описано выше, для полученияи вывода значений переменных str и val из аннотации MyAnno, связанной с мето­дом myMeth() из класса Meta.

Здесь следует обратить особое внимание на следую­щее. Во-первых, это выражение MyAnno.class в следующей строке кода:

Это выражение вычисляется как объект Class, относящийся к типу MyAnno, т.е. к искомой аннотации, и называется литералом класса.

Такое выражение мож­но использовать всякий раз, когда требуется объект Class известного класса. Например, в следующем операторе получается объект Class для класса Meta:

Безусловно, такой подход годится лишь в том случае, если заранее известноимя класса искомого объекта, что возможно далеко не всегда.

В общем, литерал класса можно получить для классов, интерфейсов, примитивных типов и масси­вов. Напомним, что синтаксис <?> имеет отношение к обобщениям в Java.

И во-вторых, это способ получения значений, связанных с переменными str и val, когда они выводятся в следующей строке кода:

Обратите внимание на то, что для обращения к ним применяется синтаксис вызова методов. Тот же самый подход применяется всякий раз, когда требуется получить член аннотации.

Советуем вам следующее видео к просмотру: