web-dev-qa-db-fra.com

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 de voir toutes les classes du JDK, contrairement à toutes les versions précédentes de Java, en raison du nouveau système de modules.

Pour contourner ce problème, la ligne de commande Java propose un nouvel argument --add-exports qui permet de rompre 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 une option similaire --add-opens utilisant la même syntaxe, mais le JEP 261 n'a pas encore été mis à jour pour le décrire (dernière mise à jour: 08/03/2017 13:58).

Quelle est la différence entre ces deux options?

[~ # ~] modifier [~ # ~] : Le JEP 261 a été mis à jour le 2017-09-22 pour Explique le.

28
vip
  • Avec --add-exports le paquet est exporté, ce qui signifie que tous les types publics et les membres qui s'y trouvent 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 membres (pas seulement publics!) Sont accessibles au moment de l'exécution.

Ainsi, la principale différence au moment de l'exécution est que --add-opens Permet une "réflexion profonde", c'est-à-dire l'accès des membres non publics. Vous pouvez généralement identifier ce type d'accès par le code réfléchissant effectuant des appels à setAccessible(true).

39
Nicolai