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