Как сделать аннотацию в Java доступной во время выполнения (Runtime)?

«Как сделать аннотацию в Java доступной во время выполнения (Runtime)?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чтобы аннотация была доступна во время выполнения программы через 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) и создания кастомной логики на основе метаданных.