Ответ
Чтобы аннотация была доступна во время выполнения программы через Reflection API, её необходимо аннотировать мета-аннотацией @Retention с политикой RetentionPolicy.RUNTIME. Без этого аннотация будет удалена компилятором или виртуальной машиной и недоступна в runtime.
Ключевые моменты:
RetentionPolicy.SOURCE– аннотация сохраняется только в исходном коде, отбрасывается компилятором (например,@Override).RetentionPolicy.CLASS– аннотация записывается в.classфайл, но не загружается JVM (значение по умолчанию).RetentionPolicy.RUNTIME– аннотация записывается в.classфайл и доступна JVM во время выполнения.
Пример создания и использования runtime-аннотации:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
// 1. Объявление аннотации с RUNTIME retention
@Retention(RetentionPolicy.RUNTIME)
public @interface RuntimeAnnotation {
String author();
int version() default 1;
}
// 2. Применение аннотации
@RuntimeAnnotation(author = "John Doe", version = 2)
public class ImportantService {
// ...
}
// 3. Чтение аннотации через Reflection в runtime
public class AnnotationProcessor {
public static void main(String[] args) {
Class<ImportantService> clazz = ImportantService.class;
RuntimeAnnotation ann = clazz.getAnnotation(RuntimeAnnotation.class);
if (ann != null) {
System.out.println("Author: " + ann.author()); // Author: John Doe
System.out.println("Version: " + ann.version()); // Version: 2
}
}
}
Практическое применение: Runtime-аннотации широко используются в фреймворках для конфигурации (Spring, JPA/Hibernate), сериализации (Jackson), тестирования (JUnit) и создания кастомной логики на основе метаданных.