Was ist der Unterschied zwischen Modul mit öffnen Schlüsselwort vor und ohne es?
Zum Beispiel:Was ist ein offenes Modul in Java 9 und wie es zu verwenden ist?
open module foo {
}
module foo {
}
Was ist der Unterschied zwischen Modul mit öffnen Schlüsselwort vor und ohne es?
Zum Beispiel:Was ist ein offenes Modul in Java 9 und wie es zu verwenden ist?
open module foo {
}
module foo {
}
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.
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.
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