web-dev-qa-db-fra.com

Qu'est-ce qu'un module ouvert dans Java 9 et comment l'utiliser)

Quelle est la différence entre le module avec open mot-clé avant et sans lui?
Par exemple:

open module foo {
}

module foo {
}
27
user8693774

Afin de fournir un accès réfléchi à votre module, Java 9 introduit open mot-clé).

Vous pouvez créer un module ouvert en utilisant le mot clé open dans la déclaration du module.

Un module ouvert accorde un accès réfléchi à tous ses packages vers d'autres modules.

Par exemple, si vous souhaitez utiliser un cadre qui s'appuie fortement sur la réflexion, comme Spring, Hibernate, etc., vous pouvez utiliser ce mot-clé pour lui permettre un accès réfléchi.

Vous pouvez activer l'accès réfléchi pour les packages spécifiés de votre module en utilisant l'instruction opens dans la déclaration de package:

module foo {
    opens com.example.bar;
}

ou en utilisant un mot clé ouvert dans la déclaration du module:

open module foo {
}

mais gardez à l'esprit que vous ne pouvez pas les combiner:

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

résultats avec erreur de compilation.

J'espère que ça aide.

19
Michał Szewczyk

Un peu d'histoire sur les directives en question. Les états Module System dans la section Briser l'encapsulation

Il est parfois nécessaire de violer les limites access-control définies par le système de modules, et imposées par le compilateur et la machine virtuelle, afin de permettre à un module d'accéder à certains des types non exportés d'un autre module. Cela peut être souhaitable pour, par exemple, permettre le test en boîte blanche des types internes, ou pour exposer les API internes non prises en charge au code qui en dépend désormais. L'option --add-exports Peut être utilisée, à à la fois au moment de la compilation et au moment de l'exécution , pour ce faire.

L'option de ligne de commande équivaut par exemple à: -

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

L'option --add-exports Permet d'accéder aux types publics d'un package spécifié.


Mais par la suite,

Il est parfois nécessaire d'aller plus loin et de permettre l'accès à tous les éléments non publics via la méthode setAccessible de l'API de réflexion principale. L'option --add-opens Peut être utilisée, au moment de l'exécution , pour ce faire.

Cette option de ligne de commande est équivalente à par exemple: -

module jdk.unsupported  {
   opens Sun.misc; 
}

Un module nommé ordinaire, en revanche, est défini explicitement avec une déclaration de module comme: -

module foo { }

et ceux-ci sont connus sous le nom de modules explicites . Les modules explicites peuvent utiliser des directives sur les packages comme indiqué ci-dessus, par exemple pour les packages export/open pour fournir un accès réfléchi à leurs membres et classes publics respectifs.


D'un autre côté, un module OPEN est un

module qui ne déclare aucun paquet ouvert mais le module résultant est traité comme si tous les paquets étaient ouverts.

De telle sorte qu'il accorde l'accès au moment de l'exécution aux types de tous les packages du module comme si tous les packages étaient exportés, ce qui signifie que le bytecode ou la réflexion peut être utilisé pour accéder à toutes les classes ou membres de chaque package dans tous les packages. Les API de réflexion avec setAccessible ou MethodHandles.privateLookupIn Permettent réflexion profonde, donc en bref vous pouvez réfléchir sur tous les membres de toutes les classes dans tous les packages. Ce qui explique également à peu près la raison pour laquelle le compilateur n'autorise pas les deux directives ouvertes vers un package alors que le module est déjà ouvert.

7
Naman