Suche
Zugriff auf interne APIs nun doch möglich

Oracle plant den „Java 9 Kill-Schalter“

Hartmut Schlosser

(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:

Projekt Jigsaw und Co.: Das erwartet uns in Java 9

Geschrieben von
Hartmut Schlosser
Hartmut Schlosser
Hartmut Schlosser ist Redakteur und Online-Koordinator bei Software & Support Media. Seine Spezialgebiete liegen bei Java-Enterprise-Technologien, JavaFX, Eclipse und DevOps. Vor seiner Tätigkeit bei S & S Media studierte er Musik, Informatik, französische Philologie und Ethnologie.
Kommentare
  1. Daniel Kraus2017-03-27 15:04:56

    Kleiner Typo im Absatz "Neue Warnmeldungen in Java 9": "[…] dass dieser „Kill-SwitCh“ lediglich im JDK 9 enthalten sein wird".

  2. Melanie Feldmann2017-03-27 16:22:04

    Danke! Korrigiert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.