0Pricing
Java Academy · Lezione

Invocare metodi e accedere ai campi

Chiami metodi privati e imposti campi non accessibili utilizzando Method.invoke e Field.set con setAccessible.

Invocare metodi e accedere ai campi è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 2 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.

setAccessible: aggirare la visibilità

Chiami field.setAccessible(true) o method.setAccessible(true) per aggirare il controllo degli accessi di Java. È necessario per i membri private. In Java 9 e versioni successive è richiesto un accesso appropriato al modulo.

Field f = User.class.getDeclaredField("name");
f.setAccessible(true);
User u = new User("Alice", 30);
System.out.println(f.get(u));  // "Alice"
f.set(u, "Bob");               // mutate the private field
System.out.println(u.getName()); // "Bob"

Leggere i valori dei campi

Utilizzi field.get(instance) per leggere il valore di qualsiasi campo, con boxing per i tipi primitivi. Per i campi static, passi null come istanza.

Field f = MyClass.class.getDeclaredField("count");
f.setAccessible(true);
int count = (int) f.get(null); // static field → null instance

Impostare i valori dei campi

Utilizzi field.set(instance, value) per scrivere in un campo. Il tipo del valore deve corrispondere oppure poter essere sottoposto ad auto-unboxing. Impostare tramite reflection un campo final produce un comportamento non definito nelle JVM moderne.

Field nameField = User.class.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(user, "Charlie");

Invocare metodi tramite reflection

Recuperi un oggetto Method, chiami setAccessible(true), quindi lo invochi con method.invoke(instance, args...). Il valore restituito è di tipo Object.

Method greet = User.class.getDeclaredMethod("greet", String.class);
greet.setAccessible(true);
String result = (String) greet.invoke(user, "World");
System.out.println(result);

Gestire InvocationTargetException

Se il metodo invocato lancia un'eccezione, la reflection la racchiude in InvocationTargetException. La estragga con getCause().

try {
    method.invoke(obj, args);
} catch (InvocationTargetException e) {
    Throwable cause = e.getCause();
    System.err.println("Method threw: " + cause.getMessage());
} catch (IllegalAccessException | NoSuchMethodException e) {
    System.err.println("Reflection error: " + e.getMessage());
}

Invocare metodi static

Passi null come argomento dell'istanza quando invoca metodi static.

Method parseInt = Integer.class.getDeclaredMethod("parseInt", String.class);
int value = (int) parseInt.invoke(null, "42"); // null = static
System.out.println(value); // 42

Creare istanze tramite un costruttore

Recuperi un Constructor, chiami setAccessible(true) per quelli private, quindi chiami newInstance(args...).

Constructor<User> ctor = User.class.getDeclaredConstructor(String.class, int.class);
ctor.setAccessible(true);
User u = ctor.newInstance("Diana", 28);
System.out.println(u);

Reflection nei framework: Spring DI

Spring utilizza la reflection per istanziare i bean e iniettare le dipendenze. Chiama i costruttori private e imposta i campi private per configurare il contesto dell'applicazione.

Accesso ai moduli in Java 9+

In Java 9 e versioni successive, i moduli limitano setAccessible per impostazione predefinita. Se la classe si trova in un modulo denominato, potrebbe essere necessario aprire il package: --add-opens java.base/java.lang=ALL-UNNAMED.

// JVM flag to open a package for reflection:
// --add-opens java.base/java.lang=ALL-UNNAMED

MethodHandles come alternativa più veloce

MethodHandles.lookup().findVirtual() fornisce l'invocazione riflessiva dei metodi con prestazioni quasi pari a una chiamata diretta dopo l'ottimizzazione JIT. È la scelta preferita nel codice di libreria critico per le prestazioni.

MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(User.class, MethodHandles.lookup());
MethodHandle handle = lookup.findVirtual(User.class, "getName", MethodType.methodType(String.class));
String name = (String) handle.invoke(user);

Best practice per la reflection

Memorizzi nella cache gli oggetti Field/Method: non li recuperi mai nei cicli hot. Racchiuda la reflection in classi di servizio. Valuti l'uso di MethodHandles per le prestazioni. Preferisca le interfacce alla reflection quando possibile.

Verifica rapida

Quando un metodo invocato tramite reflection lancia un'eccezione, quale eccezione ne racchiude la causa?

Riepilogo

Utilizzi setAccessible(true) per accedere ai membri private. Invochi i metodi tramite method.invoke(). Estragga la causa da InvocationTargetException. Memorizzi nella cache gli oggetti reflective. Preferisca MethodHandles nei percorsi hot.

Domande Frequenti

La lezione «Invocare metodi e accedere ai campi» è gratuita?

Sì — il testo completo di «Invocare metodi e accedere ai campi» è 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 «Invocare metodi e accedere ai campi»?

Chiami metodi privati e imposti campi non accessibili utilizzando Method.invoke e Field.set con setAccessible. 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 2 di 4.

Quanto tempo richiede la lezione «Invocare metodi e accedere ai campi»?

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. Ispezione delle classi con la reflection
  2. Invocare metodi e accedere ai campi
  3. Proxy dinamici con InvocationHandler
  4. Prestazioni della reflection e alternative
← Torna a Java Academy