0Pricing
Java Academy · Урок

Обработка аннотаций во время выполнения

Считывайте аннотации во время выполнения с помощью рефлексии, реализуя логику проверки, маршрутизации или внедрения.

«Обработка аннотаций во время выполнения» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Чтение аннотаций на уровне класса

Получайте аннотации класса с помощью Class.getAnnotation() (одну) или getAnnotations() (все). Если аннотация отсутствует, возвращается null.

@Service
@RequestMapping("/api")
public class UserController {}

RequestMapping rm = UserController.class.getAnnotation(RequestMapping.class);
if (rm != null) System.out.println(Arrays.toString(rm.value())); // ["/api"]

Чтение аннотаций методов

Получайте аннотации метода с помощью method.getAnnotation(). Перебирайте getDeclaredMethods(), чтобы просмотреть все методы класса.

for (Method m : UserController.class.getDeclaredMethods()) {
    GetMapping gm = m.getAnnotation(GetMapping.class);
    if (gm != null) System.out.println(m.getName() + " -> " + Arrays.toString(gm.value()));
}

Чтение аннотаций полей

Аннотации полей используются фреймворками проверки и ORM. Перебирайте getDeclaredFields() и проверяйте наличие каждой нужной аннотации.

for (Field f : User.class.getDeclaredFields()) {
    Column col = f.getAnnotation(Column.class);
    if (col != null) System.out.println(f.getName() + " -> column: " + col.name());
}

Чтение аннотаций параметров

Аннотации параметров доступны через method.getParameterAnnotations() — это двумерный массив: одна строка на параметр и одна ячейка на каждую аннотацию.

Method m = UserController.class.getDeclaredMethod("create", UserDto.class);
Annotation[][] pa = m.getParameterAnnotations();
for (Annotation a : pa[0]) System.out.println(a.annotationType().getSimpleName()); // e.g. Valid

isAnnotationPresent

Используйте isAnnotationPresent(AnnotationType.class) как быструю безопасную проверку перед чтением значения аннотации.

if (m.isAnnotationPresent(Transactional.class)) {
    beginTransaction();
    m.invoke(target, args);
    commitTransaction();
}

Создание простого контейнера внедрения зависимостей

Просканируйте пакет на наличие классов с аннотацией @Component, создайте их экземпляры через рефлексию и сохраните их в карте — это упрощённый контейнер Spring.

Map<Class<?>, Object> beans = new HashMap<>();
for (Class<?> cls : scanPackage("com.example")) {
    if (cls.isAnnotationPresent(Component.class)) {
        beans.put(cls, cls.getDeclaredConstructor().newInstance());
    }
}

Внедрение полей с аннотацией @Inject

После создания компонентов просканируйте поля с аннотацией @Inject и установите их значения через рефлексию, имитируя внедрение в поля.

for (Object bean : beans.values()) {
    for (Field f : bean.getClass().getDeclaredFields()) {
        if (f.isAnnotationPresent(Inject.class)) {
            f.setAccessible(true);
            f.set(bean, beans.get(f.getType()));
        }
    }
}

Проверка во время выполнения с использованием значений аннотаций

Прочитайте значения аннотаций ограничений (например, @Range(min=1, max=100)) и во время выполнения проверьте значение поля по этим ограничениям.

for (Field f : dto.getClass().getDeclaredFields()) {
    Range range = f.getAnnotation(Range.class);
    if (range != null) {
        f.setAccessible(true);
        int val = (int) f.get(dto);
        if (val < range.min() || val > range.max())
            throw new ValidationException(f.getName() + " out of range");
    }
}

Чтение повторяемых аннотаций

Для аннотаций @Repeatable используйте getAnnotationsByType(), чтобы прозрачно получить все экземпляры из контейнерной аннотации.

Tag[] tags = MyClass.class.getAnnotationsByType(Tag.class);
for (Tag t : tags) System.out.println(t.value());

Сканирование пакета с помощью библиотек ClassPath

Стандартная рефлексия Java не умеет перечислять все классы в пакете. Используйте библиотеки вроде Reflections, ClassGraph или ClassPathScanningCandidateComponentProvider из Spring для сканирования элементов пути к классам.

Reflections reflections = new Reflections("com.example.service");
Set<Class<?>> services = reflections.getTypesAnnotatedWith(Service.class);
services.forEach(System.out::println);

Обработка аннотаций во время выполнения: итоги

Обработка аннотаций во время выполнения лежит в основе внедрения зависимостей, проверки, маршрутизации и ORM. Эта работа выполняется при инициализации: обработайте аннотации один раз при запуске, сохраните результаты в кэше и избегайте рефлексии на путях обработки отдельных запросов.

Быстрая проверка

Какой метод получает все экземпляры аннотации @Repeatable?

Итоги

Используйте getAnnotation/isAnnotationPresent для одиночных аннотаций. Просматривайте методы и поля с помощью getDeclared*. Для повторяемых аннотаций используйте getAnnotationsByType. Выполняйте обработку при запуске и кэшируйте результаты.

Часто задаваемые вопросы

Урок «Обработка аннотаций во время выполнения» бесплатный?

Да — полный текст урока «Обработка аннотаций во время выполнения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Обработка аннотаций во время выполнения»?

Считывайте аннотации во время выполнения с помощью рефлексии, реализуя логику проверки, маршрутизации или внедрения. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Обработка аннотаций во время выполнения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Определение аннотаций: элементы и значения по умолчанию
  2. Политики хранения и типы целей
  3. Обработка аннотаций во время выполнения
  4. Процессоры аннотаций во время компиляции
← Назад к Java Academy