0Pricing
Java Academy · Lektion

Methoden aufrufen und auf Felder zugreifen

Rufen Sie private Methoden auf und setzen Sie nicht zugängliche Felder mit Method.invoke und Field.set sowie setAccessible.

Methoden aufrufen und auf Felder zugreifen ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

setAccessible: Sichtbarkeit umgehen

Rufen Sie field.setAccessible(true) oder method.setAccessible(true) auf, um die Zugriffskontrolle von Java zu umgehen. Dies ist für private Member erforderlich. Ab Java 9 ist außerdem ein entsprechender Modulzugriff nötig.

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"

Feldwerte auslesen

Verwenden Sie field.get(instance), um den Wert eines beliebigen Feldes auszulesen (primitive Werte werden dabei verpackt). Übergeben Sie bei statischen Feldern null als Instanz.

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

Feldwerte setzen

Verwenden Sie field.set(instance, value), um ein Feld zu beschreiben. Der Werttyp muss übereinstimmen oder automatisch entpackt werden können. Das Setzen eines final-Feldes per Reflection führt in modernen JVMs zu undefiniertem Verhalten.

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

Methoden per Reflection aufrufen

Rufen Sie ein Method-Objekt ab, führen Sie setAccessible(true) aus und rufen Sie die Methode anschließend mit method.invoke(instance, args...) auf. Der Rückgabewert ist vom Typ Object.

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

InvocationTargetException behandeln

Wenn die aufgerufene Methode eine Exception auslöst, verpackt Reflection sie in eine InvocationTargetException. Packen Sie sie mit getCause() wieder aus.

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 aufrufen

Übergeben Sie beim Aufruf statischer Methoden null als Instanzargument.

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

Instanzen über einen Konstruktor erstellen

Rufen Sie einen Constructor ab, führen Sie für private Konstruktoren setAccessible(true) aus und rufen Sie anschließend newInstance(args...) auf.

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

Reflection in Frameworks: Spring-DI

Spring verwendet Reflection, um Beans zu instanziieren und Abhängigkeiten zu injizieren. Dabei ruft es private Konstruktoren auf und setzt private Felder, um den Anwendungskontext zu verdrahten.

Modulzugriff in Java 9+

In Java 9+ schränken Module setAccessible standardmäßig ein. Befindet sich die Klasse in einem benannten Modul, müssen Sie möglicherweise das Package öffnen: --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 schnellere Alternative

MethodHandles.lookup().findVirtual() ermöglicht nach der JIT-Optimierung reflektive Methodenaufrufe mit einer nahezu so hohen Leistung wie direkte Aufrufe. In leistungskritischem Bibliothekscode ist diese Variante vorzuziehen.

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 Practices für Reflection

Cachen Sie Field- und Method-Objekte – rufen Sie sie niemals in Hot Loops erneut ab. Kapseln Sie Reflection in Serviceklassen. Ziehen Sie für bessere Leistung MethodHandles in Betracht. Bevorzugen Sie nach Möglichkeit Interfaces gegenüber Reflection.

Schnelltest

Welche Exception verpackt die Ursache, wenn eine reflektiv aufgerufene Methode eine Exception auslöst?

Zusammenfassung

Verwenden Sie setAccessible(true), um auf private Member zuzugreifen. Rufen Sie Methoden über method.invoke() auf. Packen Sie InvocationTargetException aus. Cachen Sie Reflection-Objekte. Bevorzugen Sie MethodHandles für Hot Paths.

Häufig gestellte Fragen

Ist die Lektion „Methoden aufrufen und auf Felder zugreifen“ kostenlos?

Ja — der vollständige Text von „Methoden aufrufen und auf Felder zugreifen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Methoden aufrufen und auf Felder zugreifen“?

Rufen Sie private Methoden auf und setzen Sie nicht zugängliche Felder mit Method.invoke und Field.set sowie setAccessible. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Methoden aufrufen und auf Felder zugreifen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Klasseninspektion mit Reflection
  2. Methoden aufrufen und auf Felder zugreifen
  3. Dynamische Proxies mit InvocationHandler
  4. Reflection-Performance und Alternativen
← Zurück zu Java Academy