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.
--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.--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)
.