Java - Modulo
Modulo - Module
- Un
módulo
es un conjunto declases
que pueden contener uno o variospackages
y que define lasdependencias
con el resto demódulos
así como la visibilidad de lasclases
que las contienen con el resto de proyectos
Inicios
-
Funcionalidad a partir de la
versión Java 9
-
Antes de la
versión Java 9
del 2017 ; lasclases
estaban organizadas a través depackages
que estaban dentro de laslibrary
de los archivosJAR-Java ARchive
- Cada
package
tiene una serie declases
que utilizamos en nuestro programa para realizar una tarea o instrucción
- Cada
-
El sistema antiguo sin
módulos
provocaba desorganización a la hora de trabajar con grupos declases
y lasdependencias
entre ellas-
Las
clases
de un mismopackage
podrían estar ubicadas en 2JAR
diferentes lo que podía provocar cierta confusión a la hora de invocarlas -
Un
conjuntos de clases
pertenece a un determinadopackage
y ese mismopackage
pertenece a ficherosJAR
-
-
A nivel lógico y estructural los
packages
son ubicados dentro de los archivosJAR-Java Archice
y este dentro deJSE System - LIBRARY
// Ejemplo
(JSE System - LIBRARY)
↓
JAR → Java ARchive
↓
Package - java.io → Bits.class
Package - java.lang → Character.class
Package - java.net → URL.class
-
MAVEN
ayudaba a la gestión de las dependencias entre unJAR
y otro con lospackages
que estén asociados pero es unaherramienta
aparte del propio sistema deJAR-Java ARchive
-
La modularidad agrega un mayor nivel de agregación por encima de los
packages
Concepto
- Java 9 utiliza la palabra clave de
module/modulo
// Ejemplo
Module
↓
Dependencies
↓
Package
↓
java.lang → Character.class
Formato de Package para Módulos
/**
* Package Principal
*
* Se usa para ser invocado desde otras dependencias desde una clase distinta al
* proyecto que fue creado
*
*/
package com.domain;
Ejemplo De Uso De Modulos
-
Estructura principal de un proyecto estandar en Java
- Desglose de todos los elementos que lo componen
1- JRE System Library
- Contiene todos archivos JAR
para poder ejecutar el programa
2- Archivos JAR
- Listado de los archivos JAR
que contiene los packages
los cuales contienen las clases
con las que utilizar en el programa
3- Package
- Contiene todas las clases
compiladas para poder ser usadas en el programa que vayamos a desarrollar
4- Package-Info
- Contiene el código que relaciona el archivo con el package
del proyecto
/**
* Package Principal
*
* Se usa para ser invocado desde otras dependencias desde una clase distinta al
* proyecto que fue creado
*
*/
package modulo.ejemplo.basico.core;
5- Clase Principal
- Elemento del programa donde se invocan las clases
que contiene los packages
del programa
/**
* Package Principal del Proyecto
*/
package modulo.ejemplo.basico.core;
/**
* Importar Clase desde otro Package
*/
import modulo.ejemplo.basico.utils.ImpuestoIVA;
/**
* Clase Principal del package para ejecutar el pago
*/
public class Pago {
/**
* Almacena el pago total del Pago
*/
private double importe;
/**
* Establece el valor del pago total
*
* @param importe - double - establece el pago total
*/
public void setImporte(double importe) {
this.importe = importe;
}
/**
* Devuelve el valor del pago total
*
* @return double - importe total
*/
public double getImporte() {
return importe;
}
/**
* Calcula el pago total incluyendole el IVA
*
* @return double - pago total aplicando el IVA
*/
public double getImporteIVA() {
return ImpuestoIVA.setCalcularIVA(this.importe);
}
}
6- modulo-info.java
- Archivo que contiene todas las referencias a los packages
que queremos usar y exportar al mismo proyecto o a otros externos con los que trabajar
/**
* Modulo
* ↓
* Packages ---> Dependencias --- otros Modulo
* ↓
* Clases
*/
module ConceptoModuloA {
// Añadimos los 'packages' que queremos usar en otras clases en otros proyectos
// Package Principal - Contiene Clases
exports modulo.ejemplo.basico.core;
// Package Secundario - Contiene Clases Complementarias
exports modulo.ejemplo.basico.utils;
}
- Desde un proyecto distinto invocamos los
packages
que se encuentra en otrosproyectos
para poder invocarlos y utilizarlos en otrasclases
distintas
7- modulo-info.java
- Modulo
/**
* Modulo del proyecto que invoca las clases del otro proyecto
*/
module ConceptoModuloB {
// Invocamos el archivo 'module-info.java'
// definido en el proyecto independiente 'ConceptoModuloA'
// para poder invocar los 'packages' y que contiene las 'clases' internas
// con las que vamos trabajar dentro del proyecto externo 'ConceptoModuleB'
// Utilizamos la palabra 'requires' para invocarlo
requires ConceptoModuloA;
}
-
La composición de un
modulo
sería a través del archivomodule-info.java
-
Dentro de los
packages
de un proyecto tendriamos-
Las
clases
con la que vamos a trabajar -
El archivo
package-info.java
con la referencia alpackage
de lasclases
que queremos utilizar dentro de nuestropackage
-
-
Fuera de la carpeta
src
del proyecto tendriamos un archivo llamadomodule-info.java
-
El
nuevo elemento
clave del lenguaje Java son losmodule
- Un grupo reutilizable de
packages
relacionados con un nombre único, así como recursos (como imágenes y archivos XML) y una descriptción delmódulo
que lo especifica
- Un grupo reutilizable de
-
Compuesto por :
-
Nombre del
module
-
Dependencias del
module
Otros modulos de los que depende un modulo en cuestión
-
-
Los
packages
explicitamente pone a disposición deotros modulos
( todos los demaspackages
en elmodulo
están implicitamente no disponibles para otrosmodulos
) , los servicios que ofrecen , losservicios
que consumen y a qué otrosmódulos
permite lareflection
oreflexión
Objetivos de los modulos
-
Configuración confiable
-
La
modularidad
proporciona mecanismos para declarar explícitamente las dependencias entremódulos
de una manera que se reconoce tanto en el momento de lacompilación
como en el momento de laejecución
-
El sistema puede recorrer estas
dependencias
para determinar el subconjunto de todos losmódulos
necesarios para admitir su aplicación
-
- Encapsulación fuerte
- Los
paquetes
en unmódulo
son accesibles para otrosmódulos
solo si elmódulo
los exporta explícitamente
- Los
- Otro
módulo
no puede usar esospaquetes
a menos que indique explícitamente que requiere las capacidades del otromódulo
- Mejora la seguridad de la plataforma porque los atacantes potenciales tienen acceso a menos clases
-
Modularidad
lo ayuda a crear diseños máslimpios
ylógicos
- Puede crear
tiempos de ejecución/runtimes
personalizados que consisten solo en losmódulos/module
que necesita para sus aplicaciones o los dispositivos a los que se dirige
Si un dispositivo no es compatible con las
GUI
, puede crear entiempo de ejecución/runtime execute
que no incluya los módulos de la GUI, lo que reduce significativamente el tamaño deltiempo de ejecución
-
Antes de Java 9 era posible usar muchas
clases
en la plataforma que no estaban pensadas para que las usaran lasclases
de una aplicación -
Migración de
código heredado
aJava 9
modularizado sea problemática si su código depende de lasAPI internas
Listas Modulos JDK
-
Java 9 es
dividir
elJDK
enmódulos
para admitir varias configuraciones -
Usando el
comando java
de lacarpeta bin
de JDK con la opción
java --list-mmodules
Declaración de Modulos
- Un
módulo
debe proporcionar un descriptor de módulometadatos
que especifican lasdependencias
delmódulo
, lospaquetes
que elmódulo
pone a disposición de otrosmódulos
y más
-
Un descriptor de
módulo
es la versión compilada de unadeclaración
demódulo
que se define en un archivo denominadomodule-info.java
-
Cada declaración de
módulo
comienza con la palabra clavemodule
, seguida de un nombre demódulo
único y un cuerpo demódulo
encerrado entre llaves - Sintaxis
// Palabra clave
// ↓ Nombre del Modulo
// ↓ ↓
module modulename{
}
- Ejemplo
module java.base{
exports java.lang;
exports java.io;
exports java.net;
exports java.util;
}
Directivas
- El cuerpo de la declaración del
módulo
puede estarvacío
o puedecontener
variasdirectivas
demódulo
incluidas
requires
-
Una
directiva
demódulo
requiere especifica que estemódulo
depende de otro módulo; esta relación se denominadependencia
demódulo
-
Cada
módulo
debe indicar explícitamente sus dependencias- Cuando el módulo A
requires
el módulo B, se dice que el módulo A lee el módulo B y el módulo A lee el módulo B
- Cuando el módulo A
-
Para especificar una dependencia en otro
módulo
, userequires
-
// Palabra Clave
// ↓ Nombre del Modulo
// ↓ ↓
requires moduleName;
-
También hay una directiva
requires static
para indicar que se requiere unmódulo
entiempo de compilación
, pero es opcional entiempo de ejecución
- Se conoce como una
dependencia opcional
- Se conoce como una
requires transitive
- Para especificar una
dependencia
en otromódulo
y asegurarse de queotros módulos
que lean sumódulo
también lean esadependencia
, conocida comolegibilidad implícita
, el usorequiere transitive
requires transitive modulename;
- Considere la siguiente
directiva
de la declaración del módulojava.desktop
requires transitive java.xml;
Cualquier módulo
que lea java.desktop
también lee implícitamente java.xml
-
Si un método del
módulo
java.desktop
devuelve un tipo delmódulo java.xml
, el código de losmódulos
que leenjava.desktop
pasa a depender dejava.xml
-
Módulos
estándar de Java SE deben otorgar legibilidad implícita en todos los casos como el que se describe aquí-
Aunque un
módulo estándar
de Java SE puede depender demódulos no estándar
, no debe otorgarleslegibilidad implícita
-
Garantiza que el código que depende solo de los
módulos estándar
deJava SE
sea portátil entre las implementaciones deJava SE
-
exports and exports…to
-
Una
directiva
demódulo de exportaciones
especifica uno de lospaquetes
delmódulo
cuyos tipos públicos (y sus tipospublic
yprotected
anidados) deben ser accesibles para el código en todos los demásmódulos
-
Una
directiva
deexports…to
le permite especificar en una lista separada por comas con precisión quémódulo
o código demódulos
puede acceder alpaquete exportado
; esto se conoce comoexportación calificada
uses
-
Una
directiva
demódulo
de usos especifica un servicio utilizado por estemódulo
, lo que convierte almódulo
en un consumidor de servicios -
Un servicio es un objeto de una clase que implementa la
interfaz
oextiende
laclase abstracta
especifica en la directiva de usos
provides…with
-
Una
directiva
de móduloprovides...with
especifica que unmódulo
proporciona unaimplementación
de servicio, lo que convierte almódulo
en un proveedor deservicios
-
La parte de la
directiva
que proporciona especifica unainterfaz
oclase abstracta
enumerada en ladirectiva
de usos de unmódulo
y la parte con de ladirectiva especifica
elnombre de la clase
de proveedor de servicios que implementa lainterfaz
o amplía laclase abstracta
open, opens, and opens…to
-
Antes de
Java 9
, lareflection
se podía usar para obtener información sobre todos lostipos
en unpaquete
y todos losmiembros
de un tipo, incluso susmiembros privados
, ya sea que desee permitir esta capacidad o no -
Una motivación clave del sistema de
módulos
es laencapsulación fuerte
-
De forma predeterminada, un tipo en un
módulo
no es accesible para otrosmódulos
a menos que sea untipo público
y exporte su paquete -
Expone solo los
paquetes
que desea exponer , esto también se aplica a la reflection -
Compilar la declaración del
módulo
se crea el descriptor delmódulo
, que se almacena en un archivo llamadomodule-info.class
en la carpeta raíz delmódulo
-
Permitir el acceso solo en tiempo de ejecución a un paquete
Allowing runtime-only access to a package
* Abrir unadirectiva
demódulo
de la siguiente forma
opens package
-
Indica que los
tipos públicos
de unpaquete especifico
(y sus tipospublic
yprotected
anidados) son accesibles para el código en otrosmódulos
solo en tiempo de ejecuciónruntime execute
-
Permitir el acceso solo en
tiempo de ejecución
a unpaquete
por parte demódulos
especificosAllowing runtime-only access to a package by specific modules
-
Una
directiva
de móduloopens…to
del formulario
opens package to comma-separated-list-of-modules
-
Indica que los
tipos públicos
de unpaquete especifico
(y sus tipospúblicos
yprotegidos
anidados) son accesibles para el código en losmódulos enumerados
solo en tiempo de ejecuciónruntime execute
-
Todos los tipos en el
paquete especifico
(y todos los miembros de los tipos) son accesibles a través de lareflexión
del código en losmódulos especificos
-
Permitir el acceso solo en
tiempo de ejecución
a todos lospaquetes
en unmódulo
Allowing runtime-only access to all packages in a module
-
Si se debe poder acceder a todos los
paquetes
en unmódulo
dado entiempo de ejecución/runtime execute
y mediantereflection
a todos los demásmódulos
, puede abrir elmódulo completo
, como en
open module modulename {
// module directives
}
Reflection Default
-
De forma predeterminada, un
módulo
conacceso reflection
entiempo de ejecución/runtime execute
a unpaquete
puede ver lostipos públicos
delpaquete
(y sus tipospublic
yprotected
anidados) -
El código de otros
módulos
puede acceder a todos lostipos del paquete
expuesto y a todos losmiembros
dentro de esos tipos, incluidos los miembrosprivate
a través desetAccessible
como en versiones anteriores de Java
Deja un comentario