Esta es el arreglo más válida que te podemos compartir, pero estúdiala pausadamente y valora si es compatible a tu proyecto.
Solución:
Para proporcionar acceso reflexivo a su módulo, Java 9 introdujo el abierto palabra clave.
Puede crear un módulo abierto utilizando el abierto palabra clave en la declaración del módulo.
Un abierto El módulo otorga acceso reflexivo a todos sus paquetes a otros módulos.
Por ejemplo, si desea usar algún marco que dependa en gran medida de la reflexión, como Spring, Hibernate, etc., puede usar esta palabra clave para habilitar el acceso reflexivo.
Puede habilitar el acceso reflexivo para paquetes específicos de su módulo usando el abre declaración en la declaración del paquete:
module foo
opens com.example.bar;
o usando el abierto palabra clave en la declaración del módulo:
open module foo
pero ten en cuenta que no puedes combinarlos:
open module foo
opens com.example.bar;
resultados con error en tiempo de compilación.
Espero eso ayude.
Un poco de información sobre las directivas en cuestión. El Sistema de Módulos establece en el Rompiendo la encapsulación sección
A veces es necesario violar la control de acceso límites definidos por el sistema del módulo, y aplicados por el compilador y la máquina virtual, para permitir que un módulo acceda a algunos de los tipos no exportados de otro módulo. Esto puede ser deseable para, por ejemplo, habilitar pruebas de caja blanca de tipos internos, o para exponer las API internas no admitidas al código que ha llegado a depender de ellas. los
--add-exports
se puede utilizar la opción, en tiempo de compilación y tiempo de ejecuciónpara hacer esto.
La opción de línea de comando es equivalente a, por ejemplo: –
module java.logging
exports java.util.logging;
los --add-exports
La opción permite el acceso a los tipos públicos de un paquete específico.
Aunque después,
A veces es necesario ir más allá y habilitar el acceso a todos los elementos no públicos a través del método setAccessible de la API de reflexión central. los
--add-opens
Se puede usar la opción, en tiempo de ejecuciónpara hacer esto.
Esta opción de línea de comando es equivalente a, por ejemplo: –
module jdk.unsupported
opens sun.misc;
Un módulo ordinario con nombre, por el contrario, se define explícitamente con una declaración de módulo como:
module foo
y estos son conocidos como módulos explícitos. Los módulos explícitos pueden usar directivas en paquetes como se indicó anteriormente, por ejemplo, para export
/open
paquetes para proporcionar acceso reflexivo a sus respectivos miembros públicos y clases.
Por otro lado, un OPEN
el modulo es un
módulo que no declara ningún paquete abierto pero el módulo resultante es
tratados como si todos los paquetes estuvieran abiertos.
De modo que otorga acceso en tiempo de ejecución a los tipos en todos los paquetes del módulo como si todos los paquetes se exportaran, lo que significa que el código de bytes o la reflexión se pueden usar para acceder a las clases o miembros de cada paquete en todos los paquetes. Las API de reflexión con setAccessible
o MethodHandles.privateLookupIn
tener en cuenta reflexión profundaasí que en resumen puede reflexionar sobre todos los miembros de todas las clases en todos los paquetes. Lo que también explica en gran medida la razón por la cual el compilador no permitirá ambas directivas abiertas en un paquete mientras el módulo ya está abierto.