Reflexion in Java: Wie man in den Code hineinschaut und ihn steuert

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Reflexion und Introspektion in Java: Magie, die jedem zugänglich ist

\n\n

Stellen Sie sich vor, Sie sind ein Programmierer, der Code schreibt, der sich selbst zur Laufzeit analysieren kann. Klingt wie Science-Fiction? In Java ist das Realität und heißt Reflexion (Reflection).

\n\n

Als ich zum ersten Mal mit Reflexion in Java in Berührung kam, war ich von ihrer Macht beeindruckt. Stellen Sie sich vor: Sie können eine Klasse anhand ihres Namens laden, alle ihre Methoden und Felder herausfinden und sogar eine private Methode aufrufen, die der Autor der Klasse verbergen wollte. Es ist, als hätte man den Schlüssel zu allen Türen eines Gebäudes. Cool? Unbedingt. Gefährlich? Auch das.

\n\n

In diesem Artikel werden wir uns ansehen, was Reflexion und Introspektion in Java sind, wie sie funktionieren und – am wichtigsten – wie man sie klug einsetzt. Es wird viel Code, Beispiele und praktische Tipps geben. Los geht's!

\n\n

Was ist Reflexion in Java einfach erklärt

\n\n

Reflexion in Java ist ein Mechanismus, der es einem Programm ermöglicht, während der Ausführung Informationen über Klassen, Schnittstellen, Methoden und Felder zu erhalten. Darüber hinaus können mit Reflexion Objekte erstellt, Methoden aufgerufen und Feldwerte geändert werden, selbst wenn sie privat sind.

\n\n

Und was ist Introspektion in Java? Es ist ein Teil der Reflexion, der für das "Hineinschauen" zuständig ist: das Abrufen von Informationen über die Struktur einer Klasse, ohne sie zu verändern. Introspektion ist Analyse, Reflexion ist Analyse + Aktion.

\n\n

Im Kern steht die Klasse java.lang.Class. Sie ist sozusagen der "Reisepass" eines jeden Objekts. Wenn die JVM eine Klasse lädt, erstellt sie ein Class-Objekt, das alle Metainformationen speichert.

\n\n

Wie man ein Class-Objekt erhält: Drei Wege

\n\n

Bevor man mit Reflexion zaubert, muss man ein Class-Objekt erhalten. Hier sind die drei wichtigsten Wege:

\n\n
// 1. Über .class\nClass<String> stringClass = String.class;\n\n// 2. Über getClass() eines Objekts\nString hello = "Hallo";\nClass<? extends String> helloClass = hello.getClass();\n\n// 3. Über Class.forName() (am flexibelsten)\ntry {\n    Class<?> dynamicClass = Class.forName("java.util.ArrayList");\n} catch (ClassNotFoundException e) {\n    e.printStackTrace();\n}\n
\n\n

Der dritte Weg ist besonders nützlich, wenn der Klassenname zur Kompilierzeit unbekannt ist – zum Beispiel, wenn er aus einer Konfigurationsdatei oder Datenbank kommt.

\n\n

Introspektion: Ein Blick ins Innere einer Klasse

\n\n

Schreiben wir eine kleine Klasse und sehen, was wir mit Introspektion in Java über sie erfahren können.

\n\n
import java.lang.reflect.*;\n\npublic class ReflectionDemo {\n    \n    private String secret = "Das ist ein Geheimnis!";\n    public int number = 42;\n    \n    public void publicMethod() {\n        System.out.println("Öffentliche Methode");\n    }\n    \n    private void privateMethod() {\n        System.out.println("Private Methode");\n    }\n    \n    public static void main(String[] args) throws Exception {\n        // Class-Objekt holen\n        Class<?> demoClass = Class.forName("ReflectionDemo");\n        \n        System.out.println("=== Klassenname ===");\n        System.out.println(demoClass.getName());\n        \n        System.out.println("\\n=== Alle Felder ===");\n        Field[] fields = demoClass.getDeclaredFields();\n        for (Field field : fields) {\n            System.out.println(field.getName() + " : " + field.getType().getSimpleName());\n        }\n        \n        System.out.println("\\n=== Alle Methoden ===");\n        Method[] methods = demoClass.getDeclaredMethods();\n        for (Method method : methods) {\n            System.out.println(method.getName() + "()");\n        }\n        \n        System.out.println("\\n=== Konstruktoren ===");\n        Constructor<?>[] constructors = demoClass.getDeclaredConstructors();\n        for (Constructor<?> constructor : constructors) {\n            System.out.println(constructor);\n        }\n    }\n}\n
\n\n

Wenn Sie dies ausführen,

Blogs

Buchempfehlungen