0Pricing
Java Academy · Lekcja

Przetwarzanie adnotacji w czasie działania

Odczytuj adnotacje w czasie działania za pomocą refleksji, aby implementować walidację, routing lub wstrzykiwanie zależności.

Przetwarzanie adnotacji w czasie działania to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Odczytywanie adnotacji na poziomie klasy

Pobieraj adnotacje klasy za pomocą Class.getAnnotation() (pojedynczej) lub getAnnotations() (wszystkich). Jeśli adnotacja nie istnieje, zwracana jest wartość 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"]

Odczytywanie adnotacji metod

Pobieraj adnotacje metod za pomocą method.getAnnotation(). Użyj iteracji po wyniku getDeclaredMethods(), aby przeskanować wszystkie metody klasy.

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

Odczytywanie adnotacji pól

Adnotacje pól są używane przez frameworki walidacyjne i ORM. Przejdź iteracyjnie po wyniku getDeclaredFields() i sprawdź każdą odpowiednią adnotację.

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

Odczytywanie adnotacji parametrów

Adnotacje parametrów są dostępne za pośrednictwem method.getParameterAnnotations() — jest to tablica dwuwymiarowa (jeden wiersz na parametr i jeden element na adnotację).

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

Użyj isAnnotationPresent(AnnotationType.class) jako szybkiego i bezpiecznego względem wartości null sprawdzenia przed odczytaniem wartości adnotacji.

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

Budowanie prostego kontenera wstrzykiwania zależności

Przeskanuj pakiet w poszukiwaniu klas oznaczonych adnotacją @Component, utwórz ich instancje za pomocą refleksji i przechowuj je w mapie — to uproszczona wersja kontenera Spring.

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

Wstrzykiwanie pól oznaczonych adnotacją @Inject

Po utworzeniu komponentów przeskanuj pola oznaczone adnotacją @Inject i ustaw je za pomocą refleksji — naśladując wstrzykiwanie do pól.

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()));
        }
    }
}

Walidacja w czasie wykonywania z użyciem wartości adnotacji

Odczytaj wartości adnotacji ograniczeń (takich jak @Range(min=1, max=100)) i sprawdź względem nich wartość pola w czasie wykonywania.

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");
    }
}

Odczytywanie adnotacji powtarzalnych

W przypadku adnotacji @Repeatable użyj getAnnotationsByType(), aby w przejrzysty sposób pobrać wszystkie instancje z adnotacji kontenera.

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

Skanowanie pakietu za pomocą bibliotek ClassPath

Standardowa refleksja języka Java nie pozwala wyświetlić listy wszystkich klas w pakiecie. Użyj bibliotek takich jak Reflections, ClassGraph lub ClassPathScanningCandidateComponentProvider z Springa do skanowania elementów classpath.

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

Przetwarzanie adnotacji w czasie wykonywania: podsumowanie

Przetwarzanie adnotacji w czasie wykonywania zasila wstrzykiwanie zależności, walidację, routing i ORM. Jest to praca wykonywana podczas inicjalizacji — przetwarzaj adnotacje raz przy uruchomieniu, zapisuj wyniki w pamięci podręcznej i unikaj refleksji w ścieżkach obsługujących pojedyncze żądania.

Szybkie sprawdzenie

Jaka metoda pobiera wszystkie instancje adnotacji @Repeatable?

Podsumowanie

Używaj getAnnotation/isAnnotationPresent do pracy z pojedynczymi adnotacjami. Skanuj metody i pola za pomocą getDeclared*. Używaj getAnnotationsByType dla adnotacji powtarzalnych. Przetwarzaj adnotacje podczas uruchamiania i zapisuj wyniki w pamięci podręcznej.

Często zadawane pytania

Czy lekcja „Przetwarzanie adnotacji w czasie działania” jest bezpłatna?

Tak — pełny tekst „Przetwarzanie adnotacji w czasie działania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Przetwarzanie adnotacji w czasie działania”?

Odczytuj adnotacje w czasie działania za pomocą refleksji, aby implementować walidację, routing lub wstrzykiwanie zależności. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Przetwarzanie adnotacji w czasie działania”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Definiowanie adnotacji: elementy i wartości domyślne
  2. Zasady retencji i typy celów
  3. Przetwarzanie adnotacji w czasie działania
  4. Procesory adnotacji w czasie kompilacji
← Powrót do Java Academy