0Pricing
Java Academy · Lezione

Elaborazione delle annotazioni a runtime

Legga le annotazioni a runtime tramite reflection per implementare logiche di validazione, routing o injection.

Elaborazione delle annotazioni a runtime è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.

Leggere le annotazioni a livello di classe

Recuperi le annotazioni di una classe utilizzando Class.getAnnotation() (una singola annotazione) o getAnnotations() (tutte). Restituisce null se l'annotazione è assente.

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

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

Leggere le annotazioni dei metodi

Recuperi le annotazioni dei metodi tramite method.getAnnotation(). Iteri su getDeclaredMethods() per analizzare tutti i metodi di una classe.

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

Leggere le annotazioni dei campi

Le annotazioni dei campi vengono utilizzate dai framework di convalida e ORM. Iteri su getDeclaredFields() e verifichi la presenza di ciascuna annotazione pertinente.

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

Leggere le annotazioni dei parametri

Le annotazioni dei parametri sono disponibili tramite method.getParameterAnnotations(): un array bidimensionale (una riga per parametro e una voce per annotazione).

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

Utilizzi isAnnotationPresent(AnnotationType.class) come controllo rapido e sicuro rispetto a null prima di leggere il valore dell'annotazione.

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

Creare un semplice contenitore per l'iniezione delle dipendenze

Analizzi un package alla ricerca delle classi annotate con @Component, le istanzi tramite reflection e le memorizzi in una mappa: un contenitore Spring semplificato.

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

Iniettare i campi annotati con @Inject

Dopo aver costruito i bean, analizzi i campi annotati con @Inject e ne imposti i valori tramite reflection, simulando l'iniezione nei campi.

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

Convalida in fase di esecuzione con i valori delle annotazioni

Legga i valori delle annotazioni dei vincoli (come @Range(min=1, max=100)) e convalidi rispetto a essi il valore del campo in fase di esecuzione.

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

Leggere le annotazioni ripetibili

Per le annotazioni @Repeatable, utilizzi getAnnotationsByType() per recuperare in modo trasparente tutte le istanze dall'annotazione contenitore.

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

Analizzare un package con librerie ClassPath

La reflection standard di Java non è in grado di elencare tutte le classi di un package. Utilizzi librerie come Reflections, ClassGraph o ClassPathScanningCandidateComponentProvider di Spring per analizzare le voci del classpath.

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

Elaborazione delle annotazioni in fase di esecuzione: riepilogo

L'elaborazione delle annotazioni in fase di esecuzione alimenta l'iniezione delle dipendenze, la convalida, il routing e l'ORM. È un'attività da eseguire durante l'inizializzazione: elabori le annotazioni una volta all'avvio, memorizzi nella cache i risultati ed eviti la reflection nei percorsi delle singole richieste.

Verifica rapida

Quale metodo recupera tutte le istanze di un'annotazione @Repeatable?

Riepilogo

Utilizzi getAnnotation/isAnnotationPresent per le annotazioni singole. Analizzi metodi e campi con getDeclared*. Utilizzi getAnnotationsByType per le annotazioni ripetibili. Esegua l'elaborazione all'avvio e memorizzi nella cache i risultati.

Domande Frequenti

La lezione «Elaborazione delle annotazioni a runtime» è gratuita?

Sì — il testo completo di «Elaborazione delle annotazioni a runtime» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.

Cosa imparerò in «Elaborazione delle annotazioni a runtime»?

Legga le annotazioni a runtime tramite reflection per implementare logiche di validazione, routing o injection. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Java Academy?

Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Elaborazione delle annotazioni a runtime»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Java Academy?

Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Definire annotazioni: elementi e valori predefiniti
  2. Politiche di conservazione e tipi di target
  3. Elaborazione delle annotazioni a runtime
  4. Annotation processor a compile time
← Torna a Java Academy