81 votes

Quelle est la différence entre --add-exports et --add-opens dans Java 9?

Java 9 (jdk-9+170) ne permet pas, par défaut, une application pour voir toutes les classes du JDK, contrairement à toutes les précédentes versions de Java, en raison du nouveau système de module.

Pour contourner ce problème, l' java de la ligne de commande offre un nouvel argument --add-exports qui permet de briser l'encapsulation comme suit:

java -jar josm.jar --add-exports java.base/sun.security.util=ALL-UNNAMED --add-exports java.base/sun.security.x509=ALL-UNNAMED

Ceci est bien expliqué dans JEP 261.

J'ai lu sur une option similaire --add-opens en utilisant la même syntaxe, mais le JEP 261 n'a pas encore été mis à jour pour la décrire (dernière mise à jour: 2017/03/08 13:58).

Quelle est la différence entre ces deux options?

EDIT: La JEP 261 a été mis à jour sur 2017-09-22 de l'expliquer.

129voto

Nicolai Points 17516
  • Avec --add-exports le package est exportée, ce qui signifie que tous les types publics et les membres y sont accessibles lors de la compilation et de l'exécution.
  • Avec --add-opens le paquet est ouvert, ce qui signifie que tous les types et les membres (et pas seulement celles du public!) y sont accessibles au moment de l'exécution.

Donc, la principale différence au moment de l'exécution est qu' --add-opens permet de "réflexion profonde", ce qui signifie l'accès des non-membres du public. Vous pouvez généralement en mesure d'identifier ce type d'accès par la réflexion de code faire des appels à l' setAccessible(true).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X