Java - Modulo
Modulo - Module
- Un
móduloes un conjunto declasesque pueden contener uno o variospackagesy que define lasdependenciascon el resto demódulosasí como la visibilidad de lasclasesque las contienen con el resto de proyectos
Inicios
-
Funcionalidad a partir de la
versión Java 9 -
Antes de la
versión Java 9del 2017 ; lasclasesestaban organizadas a través depackagesque estaban dentro de laslibraryde los archivosJAR-Java ARchive- Cada
packagetiene una serie declasesque utilizamos en nuestro programa para realizar una tarea o instrucción
- Cada
-
El sistema antiguo sin
módulosprovocaba desorganización a la hora de trabajar con grupos declasesy lasdependenciasentre ellas-
Las
clasesde un mismopackagepodrían estar ubicadas en 2JARdiferentes lo que podía provocar cierta confusión a la hora de invocarlas -
Un
conjuntos de clasespertenece a un determinadopackagey ese mismopackagepertenece a ficherosJAR
-
-
A nivel lógico y estructural los
packagesson ubicados dentro de los archivosJAR-Java Archicey 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
-
MAVENayudaba a la gestión de las dependencias entre unJARy otro con lospackagesque estén asociados pero es unaherramientaaparte 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
packagesque se encuentra en otrosproyectospara poder invocarlos y utilizarlos en otrasclasesdistintas
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
modulosería a través del archivomodule-info.java -
Dentro de los
packagesde un proyecto tendriamos-
Las
clasescon la que vamos a trabajar -
El archivo
package-info.javacon la referencia alpackagede lasclasesque queremos utilizar dentro de nuestropackage
-
-
Fuera de la carpeta
srcdel proyecto tendriamos un archivo llamadomodule-info.java -
El
nuevo elementoclave del lenguaje Java son losmodule- Un grupo reutilizable de
packagesrelacionados con un nombre único, así como recursos (como imágenes y archivos XML) y una descriptción delmóduloque lo especifica
- Un grupo reutilizable de
-
Compuesto por :
-
Nombre del
module -
Dependencias del
moduleOtros modulos de los que depende un modulo en cuestión
-
-
Los
packagesexplicitamente pone a disposición deotros modulos( todos los demaspackagesen elmoduloestán implicitamente no disponibles para otrosmodulos) , los servicios que ofrecen , losserviciosque consumen y a qué otrosmódulospermite lareflectionoreflexión
Objetivos de los modulos
-
Configuración confiable
-
La
modularidadproporciona mecanismos para declarar explícitamente las dependencias entremódulosde una manera que se reconoce tanto en el momento de lacompilacióncomo en el momento de laejecución -
El sistema puede recorrer estas
dependenciaspara determinar el subconjunto de todos losmódulosnecesarios para admitir su aplicación
-
- Encapsulación fuerte
- Los
paquetesen unmóduloson accesibles para otrosmódulossolo si elmódulolos exporta explícitamente
- Los
- Otro
módulono puede usar esospaquetesa 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
-
Modularidadlo ayuda a crear diseños máslimpiosylógicos - Puede crear
tiempos de ejecución/runtimespersonalizados que consisten solo en losmódulos/moduleque 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 executeque 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
clasesen la plataforma que no estaban pensadas para que las usaran lasclasesde una aplicación -
Migración de
código heredadoaJava 9modularizado sea problemática si su código depende de lasAPI internas
Listas Modulos JDK
-
Java 9 es
dividirelJDKenmódulospara admitir varias configuraciones -
Usando el
comando javade lacarpeta binde JDK con la opción
java --list-mmodules
Declaración de Modulos
- Un
módulodebe proporcionar un descriptor de módulometadatosque especifican lasdependenciasdelmódulo, lospaquetesque elmódulopone a disposición de otrosmódulosy más
-
Un descriptor de
móduloes la versión compilada de unadeclaracióndemóduloque se define en un archivo denominadomodule-info.java -
Cada declaración de
módulocomienza con la palabra clavemodule, seguida de un nombre demóduloúnico y un cuerpo demóduloencerrado 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ódulopuede estarvacíoo puedecontenervariasdirectivasdemóduloincluidas
requires
-
Una
directivademódulorequiere especifica que estemódulodepende de otro módulo; esta relación se denominadependenciademódulo-
Cada
módulodebe indicar explícitamente sus dependencias- Cuando el módulo A
requiresel 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 staticpara indicar que se requiere unmóduloentiempo 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
dependenciaen otromóduloy asegurarse de queotros módulosque lean sumódulotambién lean esadependencia, conocida comolegibilidad implícita, el usorequiere transitive
requires transitive modulename;
- Considere la siguiente
directivade 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ódulojava.desktopdevuelve un tipo delmódulo java.xml, el código de losmódulosque leenjava.desktoppasa a depender dejava.xml -
Módulosestándar de Java SE deben otorgar legibilidad implícita en todos los casos como el que se describe aquí-
Aunque un
módulo estándarde 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ándardeJava SEsea portátil entre las implementaciones deJava SE
-
exports and exports…to
-
Una
directivademódulo de exportacionesespecifica uno de lospaquetesdelmódulocuyos tipos públicos (y sus tipospublicyprotectedanidados) deben ser accesibles para el código en todos los demásmódulos -
Una
directivadeexports…tole permite especificar en una lista separada por comas con precisión quémóduloo código demódulospuede acceder alpaquete exportado; esto se conoce comoexportación calificada
uses
-
Una
directivademódulode usos especifica un servicio utilizado por estemódulo, lo que convierte almóduloen un consumidor de servicios -
Un servicio es un objeto de una clase que implementa la
interfazoextiendelaclase abstractaespecifica en la directiva de usos
provides…with
-
Una
directivade móduloprovides...withespecifica que unmóduloproporciona unaimplementaciónde servicio, lo que convierte almóduloen un proveedor deservicios -
La parte de la
directivaque proporciona especifica unainterfazoclase abstractaenumerada en ladirectivade usos de unmóduloy la parte con de ladirectiva especificaelnombre de la clasede proveedor de servicios que implementa lainterfazo amplía laclase abstracta
open, opens, and opens…to
-
Antes de
Java 9, lareflectionse podía usar para obtener información sobre todos lostiposen unpaquetey todos losmiembrosde un tipo, incluso susmiembros privados, ya sea que desee permitir esta capacidad o no -
Una motivación clave del sistema de
móduloses laencapsulación fuerte -
De forma predeterminada, un tipo en un
módulono es accesible para otrosmódulosa menos que sea untipo públicoy exporte su paquete -
Expone solo los
paquetesque desea exponer , esto también se aplica a la reflection -
Compilar la declaración del
módulose crea el descriptor delmódulo, que se almacena en un archivo llamadomodule-info.classen 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 unadirectivademódulode la siguiente forma
opens package
-
Indica que los
tipos públicosde unpaquete especifico(y sus tipospublicyprotectedanidados) son accesibles para el código en otrosmódulossolo en tiempo de ejecuciónruntime execute -
Permitir el acceso solo en
tiempo de ejecucióna unpaquetepor parte demódulosespecificosAllowing runtime-only access to a package by specific modules -
Una
directivade móduloopens…todel formulario
opens package to comma-separated-list-of-modules
-
Indica que los
tipos públicosde unpaquete especifico(y sus tipospúblicosyprotegidosanidados) son accesibles para el código en losmódulos enumeradossolo 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óndel código en losmódulos especificos -
Permitir el acceso solo en
tiempo de ejecucióna todos lospaquetesen unmóduloAllowing runtime-only access to all packages in a module -
Si se debe poder acceder a todos los
paquetesen unmódulodado entiempo de ejecución/runtime executey mediantereflectiona todos los demásmódulos, puede abrir elmódulo completo, como en
open module modulename {
// module directives
}
Reflection Default
-
De forma predeterminada, un
móduloconacceso reflectionentiempo de ejecución/runtime executea unpaquetepuede ver lostipos públicosdelpaquete(y sus tipospublicyprotectedanidados) -
El código de otros
módulospuede acceder a todos lostipos del paqueteexpuesto y a todos losmiembrosdentro de esos tipos, incluidos los miembrosprivatea través desetAccessiblecomo en versiones anteriores de Java
Deja un comentario