Reflection API в Java. Класс Field. Часть 2

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Данная статья:

  • написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
  • это одна из статей из нашего "Самоучителя по Java" 
  • Данная статья предполагает, что Вы уже хорошо знаете ООП.

Эта статья является ответвлением от статьи Reflection API в Java, Часть 1, где мы узнали как получить Field из класса Class.

В этой статье вы узнаете как работать с классом Field.

Класс Field

Класс Field предоставляет возможность:

  • получить значение поля, его тип, имя а так же модификаторы поля
  • получить список аннотаций, класс, в котором объявлено поле и другую информацию
  • установить новое значение в поле, даже если оно объявлено как private

Для начала, создадим класс Car

Получение значения переменной

Для того, чтобы получить значение из класса Field существуют методы getByte(), getShort(), getInt(), getLong(), getFloat(), getDouble(), getChar(), getBoolean() и get(). Как вы уже догадались, первые 8 методов существуют для получения примитивов, а последний для получения объектов.

Пример 1 Получение значения public переменной

Как видите, метод get() принимает обьект car, у которого мы и хотим спросить значение поля.

При вызове метода get() у serialNumber нам необходимо использовать кастование (от англ - cast) т.к. метод get() возвращает тип Object, но если мы знаем тип, то мы можем воспользоваться этим и преобразовать его к нужному нам.

Пример 2 Получение значения private переменной

Запускаем код ииии....  видим вот такое исключение.

А всё потому, что нельзя просто так взять и получить значение приватной переменной. Для этого, перед вызовом метода getInt(), необходимо вызвать метод setAccessible(true).

И все работает как часы.

Пример 3 Получение имени, типа и модификаторов переменной

Если с первыми двумя методами все понятно, то с третим не все так гладко. Все дело в том, что метод getModifiers() возвращает все модификаторы метода в битовом представлении. Для работы с ним необходимо воспользоваться методами класса Modifier

Пример 4 Получение аннотаций переменной

Для получения аннотаций переменной существуют методы : getAnnotations() и getDeclaredAnnotations(), getAnnotationsByType() и getDeclaredAnnotationsByType(), getAnnotation() и getDeclaredAnnotation()

Но, пары методов getAnnotations() и getDeclaredAnnotations(), getAnnotationsByType() и getDeclaredAnnotationsByType(), getAnnotation() и getDeclaredAnnotation() делают одно и то же. Как пример, javadoc для getDeclaredAnnotation():

У класса Field присутствуют эти методы т.к. он реализует общий со всеми типами интерфейс AnnotatedElement.

НО, предназначались эти методы для классов, т.к. только аннотации на классах наследуются. Чтобы влезть в существующую архитектуру JDK, разработчики решили просто реализовать один метод через другой, что и можно увидеть в классе AccessibleObject.

Поэтому мы будет использовать только три из них

Для примера нам нужно будет добавить аннотацию над полем horsepower

А теперь посмотрим на их использование

  • getAnnotations() возвращает массив аннотаций метода
  • getAnnotation() возвращает аннотацию по типу
  • getAnnotationsByType() возвращает массив аннотаций по типу. Метод был добавлен в Java 8 вместе с @Repeatable аннотациями

Пример 5 Получение дополнительных данных

Изменение значения переменных

И наконец мы узнаем как изменить значение переменной. Для этого у нас есть методы setByte(), setShort(), setInt(), setLong(), setFloat(), setDouble(), setChar(), setBoolean() и set() который принимает ссылочные типы данных.

Пример 6 Изменение значения public переменной

И нас ожидает такой вывод в консоль

Если вы позабыли, то переменная serialNumber у нас final. А у final переменной нельзя просто так взять и изменить значение. Но если уж очень сильно хочется, то setAccessible(true) вам в помощь

После чего можно наблюдать следующий вывод в консоль

Пример 7 Изменение значения private переменной

Как и в случае с получением значение private переменной или изменением final переменной, перед использованием одного из методов set необходимо вызвать метод setAccessible(true)

Вывод будет  таковым

На этом урок заканчивается

В этом уроке мы узнали:

  • как получить значение поля, его тип, имя, а так же модификаторы поля
  • как получить список аннотаций, класс, в котором объявлено поле и другую информацию
  • как установить новое значение в поле, даже если оно объявлено как private или final

Спасибо, что были с нами! 🙂


Надеемся, что наша статья была Вам полезна.  Можно записаться к нам на курсы по Java на сайте.

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr
Самоучители--узнать детальнее--