РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
123 of 1163 menu

Поле RUNTIME класса RetentionPolicy

Поле RUNTIME класса RetentionPolicy используется в аннотации @Retention для указания того, что аннотация должна сохраняться в скомпилированном байт-коде и быть доступной во время выполнения программы. Это самая «долгоживущая» политика удержания: аннотация не отбрасывается компилятором и не теряется при загрузке класса, а остается доступной через механизм рефлексии. Именно эту политику следует выбирать, если аннотация должна анализироваться во время работы приложения, например, фреймворками или библиотеками.

Поле является элементом перечисления RetentionPolicy и имеет тип RetentionPolicy. Оно применяется как значение атрибута value в аннотации @Retention. Помимо RUNTIME, существуют также значения SOURCE и CLASS, которые сохраняют аннотацию соответственно только в исходном коде или в байт-коде без доступа во время выполнения.

Синтаксис

@Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { }

Пример

Давайте объявим аннотацию с политикой удержания RUNTIME и проверим ее наличие во время выполнения через рефлексию:

import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation { } @MyAnnotation public class Main { public static void main(String[] args) { boolean res = Main.class.isAnnotationPresent(MyAnnotation.class); System.out.println(res); } }

Результат выполнения кода:

true

Пример

Давайте сравним поведение политик RUNTIME и CLASS: аннотация с политикой CLASS не будет найдена через рефлексию:

import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.CLASS) @interface ClassAnnotation { } @Retention(RetentionPolicy.RUNTIME) @interface RuntimeAnnotation { } @ClassAnnotation @RuntimeAnnotation public class Main { public static void main(String[] args) { boolean res1 = Main.class.isAnnotationPresent(ClassAnnotation.class); boolean res2 = Main.class.isAnnotationPresent(RuntimeAnnotation.class); System.out.println("CLASS: " + res1); System.out.println("RUNTIME: " + res2); } }

Результат выполнения кода:

"CLASS: false" "RUNTIME: true"

Пример

Давайте получим значение аннотации с политикой RUNTIME через рефлексию:

import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation { String value(); } @MyAnnotation("abcde") public class Main { public static void main(String[] args) { MyAnnotation ann = Main.class.getAnnotation(MyAnnotation.class); String res = ann.value(); System.out.println(res); } }

Результат выполнения кода:

"abcde"

Смотрите также

  • класс RetentionPolicy,
    который задает политики удержания аннотаций
  • аннотация Retention,
    которая указывает политику удержания
  • поле SOURCE,
    которое сохраняет аннотацию только в исходном коде
  • поле CLASS,
    которое сохраняет аннотацию в байт-коде без доступа во время выполнения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить