2017-09-29 3 views

Antwort

11

Um 9 offen Schlüsselwort eingeführt reflektierenden Zugriff auf Modul, Java zur Verfügung zu stellen.

Sie können geöffnetes Modul erstellen, indem Sie öffnen Schlüsselwort in Moduldeklaration.

Ein geöffnet Modul gewährt reflektiven Zugriff auf alle Pakete zu anderen Modulen.

Wenn Sie beispielsweise ein Framework verwenden möchten, das stark auf Reflektion basiert, wie z. B. Spring, Hibernate usw., können Sie dieses Schlüsselwort verwenden, um den reflektiven Zugriff darauf zu aktivieren.

Sie können für bestimmte Pakete des Moduls reflektierenden Zugriff aktivieren, indem Sie Anweisung in Paketdeklaration eröffnet:

module foo { 
    opens com.example.bar; 
} 

oder mit Open-Schlüsselwort in Moduldeklaration:

open module foo { 
} 

aber im Kopf behalten, dass Sie sie nicht kombinieren können:

open module foo { 
    opens com.example.bar; 
} 

Ergebnisse mit com Stapelzeitfehler.

Ich hoffe, es hilft.

+1

Es ist durch die Definition, dass die Open-Module kein Paket öffnen, da standardmäßig alle Pakete als offen in dem resultierenden Modul betrachtet werden. :) – nullpointer

5

Ein wenig Hintergrundinformationen zu den betreffenden Richtlinien. Die Module System Zustände in dem Brechen Verkapselung Abschnitt

Es ist manchmal notwendig, durch das Modulsystem der Zugangskontrolle Grenzen definiert zu verletzen, und durch den Compiler und virtuelle Maschine erzwungen, um damit ein Modul auf einige der nicht exportierten Typen eines anderen Moduls zugreifen kann. Dies kann wünschenswert sein, um z. B. White-Box-Tests von internen Typen zu ermöglichen oder nicht unterstützte interne APIs von für Code offenzulegen, der von ihnen abhängig geworden ist. Die --add-exports Option kann dazu verwendet werden, unter Kompilierzeit und Laufzeit, dies zu tun.

Die Befehlszeilenoption entspricht zum Beispiel: -

module java.logging { 
    exports java.util.logging; 
} 

Die --add-exports Option ermöglicht den Zugriff auf die öffentlichen Typen eines bestimmten Pakets.


Obwohl danach

Es ist manchmal weiter gehen erforderlich und ermöglichen den Zugang zu allen nichtöffentliche Elemente über die setAccessible Methode des Kern Reflection-API. Die --add-opens Option kann verwendet werden, zur Laufzeit, bis dies tun.

Diese Kommandozeilenoption entspricht zum Beispiel: -

module jdk.unsupported { 
    opens sun.misc; 
} 

Ein gewöhnlicher benannte Modul hingegen definiert ist explizit mit einer Moduldeklaration als: -

module foo { } 

und diese sind bekannt als explicit modules. Explizite Module können Anweisungen für Pakete verwenden, wie oben beispielsweise für export/open Pakete angegeben, um reflektierenden Zugriff auf ihre jeweiligen öffentlichen Mitglieder und Klassen zu ermöglichen.


Auf der anderen Seite, ein OPEN Modul ist ein

Modul, das keine offenen Pakete nicht erklären aber das resultierende Modul ist behandelt, als ob alle Pakete geöffnet sind .

Derart, dass sie den Zugang zur Laufzeit-Typen in allen der Modulpakete gewährt, als ob alle Pakete exportiert werden, was bedeutet, Bytecode oder Reflexion kann in allen Paketen jedes Pakets Klassen oder Mitglieder Zugang verwendet werden. Die Reflexions APIs mit setAccessible oder MethodHandles.privateLookupIn ermöglichen tiefe Reflexion, so kurz Sie auf alle Mitglieder aller Klassen in allen Paketen reflektieren kann. Dies erklärt auch ziemlich genau den Grund, warum der Compiler nicht zulassen wird both open directives to a package while the module is already open.

Verwandte Themen