Java Academy · Les

Methoden aanroepen en velden benaderen

Roep private methoden aan en stel ontoegankelijke velden in met Method.invoke en Field.set in combinatie met setAccessible.

Les 2 van 413 stappen

Methoden aanroepen en velden benaderen is een gratis Java Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

setAccessible: Toegangsbeperkingen omzeilen

Roep field.setAccessible(true) of method.setAccessible(true) aan om de toegangscontrole van Java te omzeilen. Dit is vereist voor private leden. In Java 9 en hoger is passende moduletoegang vereist.

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"

Veldwaarden lezen

Gebruik field.get(instance) om elke veldwaarde te lezen, waarbij primitieve waarden worden ingepakt. Geef voor statische velden null door als instantie.

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

Veldwaarden instellen

Gebruik field.set(instance, value) om een veld te schrijven. Het type van de waarde moet overeenkomen of automatisch uit de verpakking kunnen worden gehaald. Het instellen van een final-veld via reflectie leidt in moderne JVM's tot ongedefinieerd gedrag.

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

Methoden aanroepen via reflectie

Verkrijg een Method-object, roep setAccessible(true) aan en roep de methode vervolgens aan met method.invoke(instance, args...). De retourwaarde is Object.

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

InvocationTargetException afhandelen

Als de aangeroepen methode een uitzondering werpt, verpakt reflectie die in InvocationTargetException. Pak de oorspronkelijke uitzondering uit met 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());
}

Statische methoden aanroepen

Geef null door als instantieargument wanneer je statische methoden aanroept.

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

Instanties maken via een constructor

Verkrijg een Constructor, roep voor private constructors setAccessible(true) aan en gebruik daarna 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);

Reflectie in frameworks: Spring DI

Spring gebruikt reflectie om beans te instantiëren en afhankelijkheden te injecteren. Het roept private constructors aan en stelt private velden in om de toepassingscontext samen te stellen.

Moduletoegang in Java 9 en hoger

In Java 9 en hoger beperken modules setAccessible standaard. Als de klasse zich in een benoemde module bevindt, moet je het pakket mogelijk openen: --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 als sneller alternatief

MethodHandles.lookup().findVirtual() biedt reflectieve methode-aanroepen met bijna dezelfde prestaties als directe aanroepen na JIT-optimalisatie. Dit heeft de voorkeur in prestatiekritieke bibliotheekcode.

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

Beste werkwijzen voor reflectie

Cache Field- en Method-objecten — haal ze nooit op in veelgebruikte lussen. Verpak reflectie in serviceklassen. Overweeg MethodHandles voor betere prestaties. Geef waar mogelijk de voorkeur aan interfaces boven reflectie.

Korte controle

Welke uitzondering verpakt de oorzaak wanneer een reflectief aangeroepen methode een uitzondering werpt?

Samenvatting

Gebruik setAccessible(true) om toegang te krijgen tot private leden. Roep methoden aan via method.invoke(). Pak InvocationTargetException uit. Cache reflectieobjecten. Geef voor veelgebruikte paden de voorkeur aan MethodHandles.

Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “Methoden aanroepen en velden benaderen” gratis?

Ja — de volledige tekst van “Methoden aanroepen en velden benaderen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “Methoden aanroepen en velden benaderen”?

Roep private methoden aan en stel ontoegankelijke velden in met Method.invoke en Field.set in combinatie met setAccessible. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Methoden aanroepen en velden benaderen”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Klassen inspecteren met reflection
  2. Methoden aanroepen en velden benaderen
  3. Dynamische proxies met InvocationHandler
  4. Prestaties van reflection en alternatieven
← Terug naar Java Academy