Срок хранения в Java
Пометка может исчезнуть после компиляции, остаться
в байткоде или дожить до запуска программы. Срок
задаёт аннотация @Retention на типе своей
метки через RetentionPolicy.
Политика RetentionPolicy.SOURCE оставляет
метку только в исходнике. После компиляции в
class-файле её уже нет - удобно для подсказок
редактору и генерации, которые смотрят на текст
кода.
Метка «только для исходника» объявляется так:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.SOURCE)
@interface SourceOnly {
String tag();
}
Политика RetentionPolicy.CLASS сохраняет
пометку в байткоде, но не обязана быть видимой
стандартной рефлексии во время выполнения. Так
часто помечают служебные типы для статического
анализа:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.CLASS)
@interface ClassTag {
String tag();
}
Политика RetentionPolicy.RUNTIME оставляет
метку в собранном классе до запуска JVM. Это нужно,
когда программа или библиотека позже читают
пометки с уже загруженного типа:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface RuntimeTag {
String tag();
}
@RuntimeTag(tag = "demo")
class Marker {
}
public class Main {
public static void main(String[] args) {
System.out.println(Marker.class.getSimpleName());
}
}
Объявите три типа меток с одним строковым
элементом и разным @Retention:
SOURCE, CLASS и RUNTIME.
Повесьте каждую на свой пустой класс-заглушку.
На класс с меткой RUNTIME добавьте
main, который выводит простое имя
типа. Чтение полей
метки из программы пока не требуется.