Java Reflection meistern: Klassen, Methoden und Felder zur Laufzeit inspizieren
Java Reflection meistern
Lernen Sie, wie Javas Reflection API es Ihnen ermöglicht, Klassen, Methoden, Felder und Konstruktoren zur Laufzeit zu inspizieren und zu modifizieren, was Flexibilität erhöht und mächtiges dynamisches Verhalten ermöglicht.
In Java ermöglicht Reflection das Untersuchen und Manipulieren von Klassen, Schnittstellen, Konstruktoren, Methoden und Feldern während das Programm läuft.
Java stellt die Class-Klasse bereit, die Metadaten über eine Klasse oder Schnittstelle kapselt. Eine Instanz von Class ist das Tor zu den Reflection-Fähigkeiten.
Ein Class-Objekt erhalten
Um Reflection durchzuführen, benötigen Sie zunächst ein Class-Objekt. Es gibt drei gängige Wege, es zu erhalten:
Class.forName()verwendenClass<Hund> clazz = Class.forName("com.beispiel.Hund");Die Methode akzeptiert den vollqualifizierten Klassennamen und lädt die Klasse, falls sie noch nicht geladen ist.
getClass()auf einer Instanz verwendenHund hund = new Hund(); Class<Hund> clazz = hund.getClass();Ermittelt die Laufzeitklasse des Objekts.
- Den
.class-Literal verwendenClass<Hund> clazz = Hund.class;Bietet einen Kompilierzeit-Referenz auf das
Class-Objekt.
Sobald Sie eine Class-Instanz haben, können Sie ihre Methoden, Felder, Konstruktoren und Annotationen abfragen.
Praktisches Beispiel: Die Hund-Klasse inspizieren
import java.lang.Class; import java.lang.reflect.*; class Tier {} public class Hund extends Tier { public void anzeigen() { System.out.println("Ich bin ein Hund."); } } public class Haupt { public static void main(String[] args) { try { Hund hund = new Hund(); Class<Hund> clazz = hund.getClass(); System.out.println("Name: " + clazz.getName()); System.out.println("Modifikator: " + Modifier.toString(clazz.getModifiers())); System.out.println("Oberklasse: " + clazz.getSuperclass().getName()); } catch (Exception e) { e.printStackTrace(); } } }
Ausgabe:
Name: com.beispiel.Hund Modifikator: public Oberklasse: com.beispiel.Tier
In diesem Snippet erstellen wir eine Hund-Instanz, erhalten ihr Class-Objekt und fragen Klassenname, Zugriffsmodifikator und Oberklasse ab.
Für tiefere Einblicke in Class konsultieren Sie die offizielle Java Class Dokumentation.
Felder, Methoden und Konstruktoren erkunden
Method– Details zu Methoden.Field– Details zu Feldern.Constructor– Details zu Konstruktoren.
Methoden reflektieren
Die Method-Klasse macht Metadaten wie Name, Rückgabetyp und Modifikatoren verfügbar. Nachfolgend ein prägnantes Beispiel:
import java.lang.reflect.*; class Hund { public void anzeigen() { System.out.println("Ich bin ein Hund."); } private void tonMachen() { System.out.println("Wuff Wuff"); } } public class Haupt { public static void main(String[] args) { try { Hund hund = new Hund(); Method[] methoden = hund.getClass().getDeclaredMethods(); for (Method m : methoden) { System.out.println("Methodenname: " + m.getName()); System.out.println("Modifikator: " + Modifier.toString(m.getModifiers())); System.out.println("Rückgabetyp: " + m.getReturnType()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Ausgabe:
Methodenname: anzeigen Modifikator: public Rückgabetyp: void Methodenname: tonMachen Modifikator: private Rückgabetyp: void
Für eine umfassende Liste der Method-Utilities besuchen Sie die offizielle Method-Dokumentation.
Felder reflektieren
Felder können zur Laufzeit zugegriffen und modifiziert werden. Die Field-Klasse bietet get, set und Modifier-Utilities. Beispiel:
import java.lang.reflect.*; class Hund { public String typ; private String farbe; } public class Haupt { public static void main(String[] args) { try { Hund hund = new Hund(); Class<Hund> clazz = hund.getClass(); // Öffentliches Feld Field typFeld = clazz.getField("typ"); typFeld.set(hund, "labrador"); System.out.println("Wert: " + typFeld.get(hund)); System.out.println("Modifikator: " + Modifier.toString(typFeld.getModifiers())); // Privates Feld Field farbeFeld = clazz.getDeclaredField("farbe"); farbeFeld.setAccessible(true); farbeFeld.set(hund, "braun"); System.out.println("Wert: " + farbeFeld.get(hund)); System.out.println("Modifikator: " + Modifier.toString(farbeFeld.getModifiers())); } catch (Exception e) { e.printStackTrace(); } } }
Ausgabe:
Wert: labrador Modifikator: public Wert: braun Modifikator: private
Erkunden Sie die Field-Klassen-Dokumentation für fortgeschrittene Nutzung.
Konstruktoren reflektieren
Konstruktoren werden via Constructor-Klasse introspektiert. Der folgende Code listet alle Konstruktoren von Hund auf:
import java.lang.reflect.*; class Hund { public Hund() {} private Hund(int alter) {} } public class Haupt { public static void main(String[] args) { try { Constructor<Hund>[] kons = Hund.class.getDeclaredConstructors(); for (Constructor<Hund> c : kons) { System.out.println("Konstruktorname: " + c.getName()); System.out.println("Modifikator: " + Modifier.toString(c.getModifiers())); System.out.println("Parameter: " + c.getParameterCount()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
Ausgabe:
Konstruktorname: Hund Modifikator: public Parameter: 0 Konstruktorname: Hund Modifikator: private Parameter: 1
Für weitere Details siehe die Constructor-Dokumentation.
Java
- Javas final-Schlüsselwort verstehen: Variablen, Methoden und Klassen
- Java instanceof-Operator: Ein umfassender Leitfaden
- Java-Vererbung meistern: Konzepte, Typen und praktische Beispiele
- Java statische verschachtelte Klassen verstehen: Nutzung, Unterschiede und Beispiele
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java Singleton-Pattern erklärt: Sichere Implementierung und Verwendung
- Java ArrayList meistern: Operationen, Methoden und Best Practices
- Java ObjectOutputStream meistern: Serialisierung, Methoden und praktische Beispiele
- Java Generics meistern – Wiederverwendbaren, typsicheren Code erstellen
- Java-Dateioperationen mit java.io meistern – Erstellen, Lesen, Schreiben & Löschen