Reflection und Konfiguration
Dynamische Funktionen handhaben
Reflection und Konfiguration ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.
Reflection und Konfiguration
Die Closed-World-Analyse von native-image kann nur Code erkennen, den sie statisch nachverfolgen kann. Dynamische Funktionen — Reflection, Proxys, Ressourcen und Serialisierung — verbergen ihre Ziele vor dem Analysator. In dieser Lektion erfahren Sie, wie Sie diese Funktionen in einer nativen Binärdatei zum Laufen bringen.
Das Problem mit Reflection
Wenn Sie eine Klasse anhand ihres Namens aus einem String ermitteln, kann der Analysator nicht wissen, welche Klasse Sie meinen. Wenn diese Klasse anderweitig nicht erreichbar ist, wird sie aus dem Image ausgeschlossen und die Ermittlung schlägt zur Laufzeit fehl.
public class Main {
public static void main(String[] args) throws Exception {
String name = "java.util.ArrayList"; // could come from config
Class<?> c = Class.forName(name);
System.out.println("Loaded: " + c.getSimpleName());
}
}Reachability-Metadaten
Die Lösung sind Reachability-Metadaten: JSON-Dateien, die native-image mitteilen, welche Klassen, Methoden und Felder dynamisch verwendet werden. Der Build behält sie dann bei und erfasst ihre Member.
reflect-config.json
Ein Reflection-Eintrag nennt die Klasse und die beizubehaltenden Member. Dieses Snippet ist JSON, kein Java — es liegt unter META-INF/native-image/.
[
{
"name": "com.example.Person",
"allDeclaredConstructors": true,
"allDeclaredMethods": true,
"fields": [ { "name": "age" } ]
}
]Der Tracing Agent
Metadaten von Hand zu schreiben ist mühsam. Starten Sie Ihre Anwendung mit dem Tracing Agent (-agentlib:native-image-agent=config-output-dir=...) auf der JVM. Er zeichnet jeden dynamischen Zugriff während einer echten Ausführung auf und erzeugt die Konfigurationsdateien automatisch.
Ihre Codepfade testen
Der Agent zeichnet nur auf, was tatsächlich ausgeführt wird. Daher müssen Sie die Anwendung durch alle ihre Funktionen führen — führen Sie Ihre Tests unter diesem Agenten aus. Jeder reflektive Pfad, den Sie übersehen, fehlt in den Metadaten und führt im nativen Build zu einem Fehler.
Dynamische Proxys
Dynamische JDK-Proxys benötigen eine proxy-config.json, in der die Schnittstellenmengen aufgeführt sind, für die Proxys erzeugt werden. Der Analysator kann diese nicht ableiten, weil die Schnittstellenliste zur Laufzeit zusammengestellt wird.
Ressourcen
Dateien, die über getResourceAsStream geladen werden, werden nicht automatisch eingebettet. Eine resource-config.json mit Glob-Mustern teilt native-image mit, welche Ressourcen in die ausführbare Datei eingebunden werden sollen.
public class Main {
public static void main(String[] args) {
var url = Main.class.getResource("/banner.txt");
System.out.println("Resource present: " + (url != null));
}
}Serialisierung und JNI
Auch Java-Serialisierung und native (JNI-)Aufrufe sind dynamisch. Für beide gibt es eine eigene Konfigurationsdatei (serialization-config.json, jni-config.json). Der Tracing Agent erzeugt diese ebenfalls, wenn die entsprechenden Pfade ausgeführt werden.
Programmgesteuerte Registrierung
Bibliotheksautoren können Metadaten im Code programmgesteuert registrieren, indem sie über die RuntimeReflection-API ein Feature verwenden, das zur Build-Zeit ausgeführt wird. Dadurch wird die korrekte Konfiguration innerhalb der Bibliothek ausgeliefert, sodass Benutzer keine manuelle Einrichtung benötigen.
Gemeinsames Metadaten-Repository
GraalVM pflegt ein gemeinschaftliches Reachability-Metadaten-Repository mit vorgefertigten Konfigurationen für beliebte Bibliotheken. Die nativen Build-Tools können es automatisch abrufen, sodass gängige Frameworks sofort funktionieren.
Kurzer Test
Testen Sie Ihr Verständnis dynamischer Funktionen in Native Image.
Zusammenfassung
Sie haben gelernt, mit dynamischen Funktionen umzugehen:
- Reflection, Proxys, Ressourcen, Serialisierung und JNI sind für die statische Analyse unsichtbar.
- Reachability-Metadaten in JSON-Dateien deklarieren diese Funktionen für native-image.
- Der Tracing Agent erzeugt Konfigurationen automatisch aus einer echten JVM-Ausführung.
- Führen Sie alle Codepfade aus, insbesondere Tests, damit nichts übersehen wird.
- Verwenden Sie das gemeinsame Metadaten-Repository für beliebte Bibliotheken.
Häufig gestellte Fragen
Ist die Lektion „Reflection und Konfiguration“ kostenlos?
Ja — der vollständige Text von „Reflection und Konfiguration“ 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 „Reflection und Konfiguration“?
Dynamische Funktionen handhaben 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 3 von 4.
Wie lange dauert die Lektion „Reflection und Konfiguration“?
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
- Was ist GraalVM
- Ein Native Image erstellen
- Reflection und Konfiguration
- Abwägungen beim Native Image