Обработка аннотаций во время выполнения
Считывайте аннотации во время выполнения с помощью рефлексии, реализуя логику проверки, маршрутизации или внедрения.
«Обработка аннотаций во время выполнения» — бесплатный урок 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. ValidisAnnotationPresent
Используйте 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 — локальная установка не требуется.
Все уроки этого курса
- Определение аннотаций: элементы и значения по умолчанию
- Политики хранения и типы целей
- Обработка аннотаций во время выполнения
- Процессоры аннотаций во время компиляции