java module command-line-arguments java-9 jigsaw

¿Cuál es la diferencia entre--add-exports y--add-opens en Java 9?



java se 11 (1)

  • Con --add-exports el paquete se exporta, lo que significa que todos los tipos y miembros públicos en él son accesibles durante la compilación y el tiempo de ejecución.
  • Con --add-opens el paquete se abre, lo que significa que todos los tipos y miembros (¡no solo los públicos!) Están accesibles en tiempo de ejecución.

Entonces, la principal diferencia en el tiempo de ejecución es que --add-opens permite "reflexión profunda", lo que significa acceso de miembros no públicos. Normalmente puede identificar este tipo de acceso mediante el código reflejado que realiza llamadas a setAccessible(true) .

Java 9 (jdk-9 + 170) no permite por defecto que una aplicación vea todas las clases desde el JDK, a diferencia de todas las versiones anteriores de Java, debido al nuevo sistema de módulos.

Para solucionar esto, la línea de comandos java ofrece un nuevo argumento --add-exports que permite romper la encapsulación de la siguiente manera:

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

Esto está bien explicado en JEP 261 .

He leído sobre una opción similar --add-opens usando la misma sintaxis, pero el JEP 261 aún no se ha actualizado para describirlo (última actualización: 2017/03/08 13:58).

¿Cuál es la diferencia entre estas dos opciones?

EDITAR : El JEP 261 se ha actualizado el 2017-09-22 para explicarlo.