Oracle plant den „Java 9 Kill-Schalter“

(c) Shutterstock / fredex
Java 9 soll eine Möglichkeit erhalten, die geplante Kapselung interner APIs zu umgehen. Das soll Migrationen bestehender Java-Projekte auf Java 9 erleichtern. Der „Java 9 Kill Switch“ soll im JDK 10 aber wieder entfernt werden.
Java 9 und das Problem der internen APIs
Mit Java 9 hält eine wichtige Neuerung Einzug in das JDK: Im Zuge der Modularisierung der Plattform (aka. Jigsaw) werden interne APIs vor äußeren Zugriffen abgekapselt und sind nicht mehr wie bisher über das Reflection API erreichbar.
Weshalb das auch für Ihre Anwendung wichtig sein kann?
Weil zahlreiche populäre Bibliotheken und Java-Frameworks via Reflection auf die internen APIs zugreifen. Wenn Ihre Java-Anwendung nun auf Java 9 migriert werden soll und eine der betroffenen Libraries bzw. Frameworks einsetzt, kommt es zu Problemen. Die dann geworfenen IllegalAccessException
oder InaccessibleObjectException
können zwar umgangen werden, das kann bei großen Anwendungen aber keineswegs trivial sein.
Lesen Sie auch: 5 Java-9-Features, die die Softwareentwicklung verändern werden
Neue Kommandozeilen-Optionen in Java 9: Big Kill Switch
Auf das Feedback vieler alarmierter Anwender hin hat Oracle nun reagiert und Pläne bekannt gegeben, in das JDK 9 eine Art Java-9-Kill-Schalter (intern bezeichnet als „big kill switch“) einzubauen: Über die Kommandozeilen-Option --permit-illegal-access
soll der Zugriff auf interne Elemente nun doch ausdrücklich erlaubt werden.
Genauer: Wenn die Option --permit-illegal-access
zur Laufzeit gegeben ist, ist der sonst verbotene Zugriff durch Code in unbenannten Modulen (d.h. Code im Klassenpfad) auf Typen-Mitglieder benannter Module über die Standard Reflection APIs java.lang.reflect
und java.lang.invoke
möglich. Insbesondere bezieht sich dies auf solche Zugriffe, die normalerweise eine IllegalAccessException
oder eine InaccessibleObjectException
auswerfen würden.
Nicht abgedeckt werden dadurch Zugriffe durch Code in benannten Modulen auf Typen-Mitglieder anderer benannter Module. In diesen Fällen stehen die Optionen --add-opens
oder --add-exports
zur Verfügung, die auch mit dem neuen --permit-illegal-access
kombiniert werden können.
Neue Warnmeldungen in Java 9
Darüber hinaus sind neue Warnhinweise vorgesehen: Findet durch die Nutzung der neuen Optionen tatsächlich ein sonst verbotener reflektiver Zugriff auf interne Elemente statt, wird die folgende Warnmeldung in den Error Stream geschrieben:
WARNING: Illegal access by $PERPETRATOR to $VICTIM (permitted by $OPTION)
Auf der OpenJDK-Mailing-Liste beschreibt Mark Reinhold die neuen Optionen im Detail. Deutlich weist Reinhold allerdings darauf hin, dass dieser „Kill-Switch“ lediglich im JDK 9 enthalten sein wird. Um betroffene Libraries und Frameworks dazu zu motivieren, ihre Projekte an die neuen Jigsaw-Kapselungen interner APIs anzupassen, soll der Kill-Switch in JDK 10 nicht mehr unterstützt werden.
In den aktuellen Java 9 Jigsaw Early Access Builds sind die neuen Optionen bereits umgesetzt. Ein Merge ins JDK 9 soll in Kürze folgen.
Video-Tipp:
Kleiner Typo im Absatz „Neue Warnmeldungen in Java 9“: „[…] dass dieser „Kill-SwitCh“ lediglich im JDK 9 enthalten sein wird“.
Danke! Korrigiert.