Поле CLASS класса RetentionPolicy
Поле CLASS класса RetentionPolicy - это константа перечисления, которая задаёт политику удержания аннотации. Когда аннотация помечена Retention со значением CLASS, компилятор записывает её в файл .class, однако виртуальная машина Java не сохраняет её в памяти во время выполнения. Это означает, что такая аннотация видна инструментам, работающим с байт-кодом (например, анализаторам или генераторам кода), но недоступна через рефлексию. Если политика удержания не указана явно, по умолчанию используется именно CLASS. Само поле не принимает параметров - это элемент перечисления RetentionPolicy, который передаётся в атрибут value аннотации Retention.
Синтаксис
RetentionPolicy.CLASS
Пример
Объявим аннотацию с политикой удержания CLASS и проверим, доступна ли она во время выполнения:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.CLASS)
@interface MyClassAnnotation
{
}
public class Main
{
public static void main(String[] args)
{
boolean present = Main.class.isAnnotationPresent(MyClassAnnotation.class);
System.out.println(present);
}
}
Результат выполнения кода:
false
Несмотря на то что аннотация присутствует в байт-коде, во время выполнения она не видна - поэтому isAnnotationPresent возвращает false.
Пример
Сравним поведение CLASS и RUNTIME: только аннотация с RUNTIME будет обнаружена через рефлексию:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.CLASS)
@interface ClassRetention
{
}
@Retention(RetentionPolicy.RUNTIME)
@interface RuntimeRetention
{
}
@ClassRetention
@RuntimeRetention
public class Main
{
public static void main(String[] args)
{
System.out.println(Main.class.isAnnotationPresent(ClassRetention.class));
System.out.println(Main.class.isAnnotationPresent(RuntimeRetention.class));
}
}
Результат выполнения кода:
false
true
Смотрите также
-
класс
RetentionPolicy,
который содержит все политики удержания -
аннотация
Retention,
которая задаёт политику удержания -
поле
SOURCE,
которое отбрасывает аннотацию после компиляции -
поле
RUNTIME,
которое сохраняет аннотацию во время выполнения