Поле 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,
которое сохраняет аннотацию в байт-коде без доступа во время выполнения