Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Java Intermedio Cfe SSB 80 Hrs
Java Intermedio Cfe SSB 80 Hrs
CFE
Edición 2023
Propiedad intelectual
Material didáctico preparado por la empresa Global K, S.A. de
C.V., Registrado en Derechos de Autor.
¿Cuál es tu nombre?
1. Nombre de la clase.
2. Atributos o campos.
3. Métodos.
Instancias de una clase
Ejemplo de la definición de una clase en Java
Creación de instancias u objetos en Java
Representación de objetos en memoria
Paquetes en Java
Importación de una clase en Java
Importación de varias clases
Encapsulación
Modificadores de acceso
Clase encapsulada en Java
Herencia
La herencia es el concepto de “reúso de código”, es el proceso en el
que una clase adquiere las propiedades (atributos y métodos) de otra.
Herencia en Java
Herencia en Java (Cont.)
Polimorfismo
Los conceptos de polimorfismo y herencia están íntimamente
relacionados.
La herencia te permite reusar los atributos y métodos de otra clase.
El polimorfismo te permite utilizar esos métodos heredados para
realizar diferentes tareas.
De ahí viene “polimorfismo”, poder realizar un método de diferentes
formas.
Existen dos tipos de polimorfismo:
•Estático
•Dinámico
Polimorfismo estático
En Java, y en otros lenguajes de programación orientados a objetos, te
permiten implementar múltiples métodos dentro de la misma clase con
el mismo nombre, pero con diferentes parámetros, a esto se le conoce
como sobrecarga de métodos y representa una forma estática de
polimorfismo.
Polimorfismo dinámico
Esta forma de polimorfismo nos permite que el compilador determine
el método que se va a ejecutar de acuerdo al objeto creado en la
variable. La Java Virtual Machine necesita realizar esa determinación
en tiempo de ejecución.
Clases Abstractas
Son aquellas que sirven de
base para la definición de las
subclases.
No se pueden instanciar
debido a que no están
completamente definidas o no
tienen significado práctico
para la aplicación.
Se marcan con la palabra
reservada “abstract”.
Pueden tener métodos
concretos y/o abstractos.
Clases abstractas en Java
Clase hija de una clase abstracta
Interfaces en Java
Definen un comportamiento que una o más clases esperan
implementar.
Se desea realizar una aplicación bancaria que permita el acceso a sus servicios de forma
online y en horario 7 x 24 que acerque la sucursal bancaria a los clientes ofreciendo todo tipo
de servicios, en la primera versión se iniciará una aplicación standalone con los servicios
básicos, como son el manejo clientes y la operación de los diversos tipos de cuentas.
Proyecto de Banca Electrónica
El diagrama inicial propuesto es el siguiente:
Evaluación Práctica 1
Práctica 1.1 Crear un proyecto en Netbeans que se llame BancaElectronica, crear tres
paquetes que se llamen presentación, modelo e integración. En el paquete modelo
implementar cada una de las clases del diagrama del proyecto.
Práctica 1.2 En la clase principal del proyecto, en la clase que tiene el método main, crear un
objeto de tipo Banco, dos clientes con sus respectivos datos y agregarle a cada uno de ellos
dos cuentas, una de Ahorros y otra de Cheques.
Si notamos, a nuestra aplicación ahora le estamos agregando dos interfaces que representan
a los servicios: ServicioCuentas y ServicioClientes.
Práctica 2.1 Implementar las interfaces en sus respectivas clases, en Banco ServicioClientes y
en Cliente ServicioCuentas, implementar la funcionalidad de cada uno de los métodos.
Práctica 2.2 Validar el funcionamiento de las clases y sus métodos desde la clase principal,
invocando sobre los objetos, previamente creados, los métodos de servicio de las interfaces
implementadas.
Evaluación práctica
Interfaces
https://docs.oracle.com/javase/tutorial/java/concepts
/interface.html
Modificadores en una interfaz
https://docs.oracle.com/javase/specs/jls/se16/html/jl
s-9.html#jls-9.1.1
Métodos en una interfaz
https://docs.oracle.com/javase/specs/jls/se16/html/jl
s-9.html#]ls-9.4
Sobreescritura
https://docs.oracle.com/javase/specs/jls/se16/html/jl
Referencias s-9.html#]ls-9.4.2
Interfaces funcionales
Bibliográficas https://docs.oracle.com/javase/specs/jls/se16/html/jl
s-9.html#ls-9.8
Capítulo 3. Manejo de
Generics en Java
Objetivo
Dentro de este capítulo aprenderás a:
3.2.- Cambiar los arreglos por colecciones para facilitar el procesamiento de los datos. Es
importante usar las colecciones que se muestran en el diagrama.
3.3.- Realizar los cambios pertinentes a los métodos para que funcionen con las colecciones.
Una clase anidada anónima puede ser útil cuando se crea una
instancia de un objeto con ciertos "extras" como los métodos de
sobrecarga de una clase o interfaz, sin tener que implementarla o
extenderla explícitamente de una clase.
Uso de clase Anidada anónima
Usos de las clases Anidadas
Es una forma de agrupar lógicamente las clases que solo se usan en
un lugar.
Aumenta la encapsulación.
El patrón de diseño Builder permite crear objetos que habitualmente son complejos utilizando otro objeto
más simple que los construye paso por paso.
Este patrón Builder se utiliza en situaciones en las que debe construirse un objeto repetidas veces o
cuando este objeto tiene gran cantidad de atributos y objetos asociados, y en donde usar constructores
para crear el objeto no es una solución cómoda.
4.1 Implementa el patrón de diseño Builder para la clase Cliente. Investiga en internet en qué consiste
este patrón, en qué mejora el código y cómo se implementa, si tienes dudas consulta con tu instructor
cómo se aplica en la programación este patrón.
4.2 Implementa el patrón de diseño Singleton para la clase Banco. Investiga en internet en que consiste
este patrón, en qué mejora el código y cómo se implementa, si tienes dudas consulta con tu instructor
cómo se aplica en la programación este patrón.
Clases anidadas
https://docs.oracle.com/javase/specs/jls/se16/html/jl
s-8.html#d5e12711
https://docs.oracle.com/javase/tutorial/java/javaOO/
nested.html
Clases internas
https://docs.oracle.com/javase/specs/jls/se16/html/jl
s-8.html#d5e12759
Clases anónimas
Referencias https://docs.oracle.com/javase/tutorial/java/javaOO/
anonymousclasses.html
Bibliográficas
Capitulo 5. Expresiones
Lambda
Objetivo
En este capítulo aprenderás a:
Implementar clases anidadas anónimas con interfaces.
}
Evaluación práctica
5.1 Los requerimientos para esta práctica son los siguientes:
Bibliográficas
Capítulo 6. Interfaces
Funcionales
Objetivos
Dentro de este capítulo aprenderás a:
Implementar las interfaces funcionales del paquete java.util.function.
6.2 Introduce los códigos de los ejemplos de las interfaces binarias y de aquellas que manejan
tipos primitivos, prueba los códigos, analiza cómo funcionan y deduce en dónde podrías
aplicarlas. ¿Podrías dar ejemplos de su uso?.
Interfaces Funcionales
https://docs.oracle.com/javase/specs/jls/se16/html/jl
s-18.html#ls-18.5.3
Paquete java.util.function
https://docs.oracle.com/en/java/javase/16/docs/api/j
ava.base/java/util/function/package-summary.html
Referencias
Bibliográficas
Capítulo 7. Streams
Objetivo
En este capítulo aprenderás a:
Reconocer los tipos de operaciones de la API de Stream.
Operaciones Intermedias
filter(Predicate<T>), map(Function<T,R>), sorted(),
sorted(Comparator<T>), mapToDouble(ToDoubleFunction<T>),
mapToInt(ToIntFunction<T>), peek(Consumer<T>).
Operaciones Finales
forEach(Consumer<T>), count(), sum(), average(), collect(Collectors).
Tipos de Operaciones en la API de Stream
7.1 Adaptar todos los métodos para que funcionen con la API de Stream. (Las funciones del
ServicioClientes y ServicioCuentas).
7.2 Validar que todos los métodos funcionen correctamente, realizando pruebas en la clase
principal.
Nota: Para realizar esta práctica es necesario conocer las operaciones iniciales, intermedias
con corto circuito y finales de la API de Stream.
Stream
https://docs.oracle.com/en/java/javase/16/docs/api/j
ava.base/java/util/stream/Stream.html
Procesamiento de datos con Streams
https://www.oracle.com/technical-
resources/articles/java/ma14-java-se-8-
streams.html
https://docs.oracle.com/javase/tutorial/collections/str
Referencias eams/index.html
Bibliográficas
Capítulo 8. Entrada y Salida
de Datos
Objetivos
En este capítulo aprenderás a:
Diferenciar entre IO y NIO.2.
8.1 Crea un programa en Java que tenga una clase que permita serializar un objeto de la clase
Cliente usando uno de sus métodos y utilizando otro método para recobrar el objeto
serializado.
8.2 En el método main serialize y deserialize un objeto Cliente, comprueba que funcione de
manera correcta.
IO y NIO
https://docs.oracle.com/javase/8/docs/technotes/gui
des/io/index.html
File IO
https://docs.oracle.com/javase/tutorial/essential/io/fil
eio.html
Referencias
Bibliográficas
Capítulo 9. Manejo de
Archivos
Objetivos
En este capítulo aprenderás a:
Utilizar la interfaz Path y la clase Paths.
Este método es muy similar al método list, pero tiene la diferencia que
este método entra a carpetas y subcarpetas de un directorio.
Cabe resaltar que este método es más pesado que list, es
recomendable tomar precauciones al utilizarlo.
Ejemplo de walk
Resumen del capítulo
En Java, puedes manejar archivos utilizando las clases y métodos
proporcionados por los paquetes java.io y java.nio.file. Esto te permite
realizar operaciones de lectura, escritura y manipulación de archivos y
directorios en el sistema de archivos de manera efectiva y segura. Además,
ten en cuenta el manejo adecuado de excepciones y el cierre de recursos
para escribir un código robusto y confiable.
Evaluación Práctica 9
Hasta el momento los datos para probar la aplicación los hemos escrito manualmente en la
clase Principal, ahora usaremos algunos archivos para poder probar la funcionalidad de
nuestras clases y validar que toda la aplicación funcione correctamente.
9.2 Dentro de la clase principal crear tres clientes con los números 1, 2, 3.
Validar que los métodos del cliente sigan funcionando de manera correcta.
Path
https://docs.oracle.com/javase/tutorial/essential/io/p
ath.html
Operaciones con Path
https://docs.oracle.com/javase/tutorial/essential/io/p
athOps.html
Operaciones con archivos
https://docs.oracle.com/javase/tutorial/essential/io/fil
Referencias eOps.html
Bibliográficas
Capítulo 10. Manejo de
Fechas
Objetivos
En este capítulo aprenderás:
Clases principales del paquete java.time.
• fechaApertura (Cuenta).
• fechaCancelacion (Cuenta).
• fechaNacimiento (Cliente).
Haz los cambios necesarios en las clases relacionadas con las fechas para que funcionen de
manera correcta, por ejemplo, actualiza los métodos sets y gets, así como en los métodos de
impresión de los objetos.
Evaluación Práctica
Fechas
https://docs.oracle.com/javase/tutorial/datetime/iso/
date.html
Fechas y Tiempo
https://docs.oracle.com/javase/tutorial/datetime/iso/
datetime.html
Zonas
https://docs.oracle.com/javase/tutorial/datetime/iso/ti
mezones.html
Análisis y formateo de fechas
Referencias https://docs.oracle.com/javase/tutorial/datetime/iso/f
Bibliográficas ormat.html
Capítulo 11. Manejo de
Hilos
Objetivos
En este capítulo aprenderás a:
Definir un hilo.
Implementar Runnable.
Para esta práctica el reto es ejecutar la lectura del archivo en un hilo usando ExecutorService
y newSingleThreadExecutor().
Bibliográficas
Capítulo 13. JDBC –
Conectividad de Base de
Datos Java
Objetivos
En este capítulo aprenderás:
Una introducción a bases de datos relacionales.
La instalación de MySQL.
Llave
Primaria Llave
Foránea
Motor de base
de datos
Base de Datos Relacionales | Conceptos
2 3 6
ID Nombre Apellido Salario Jefe Inmediato Departamento
100 Gabriel Guerra 50000 55 100
101 Jesús Paz 30000 100 100 4
1 102 Marco Espejo 35000 100 100
103 Ana Salgado 35000 null 5 101
Bases de Datos Relacionales | Normalización
SQL
DML DDL
selec, insert, update, delete, create, alter, drop, rename,
truncate, comment
InnoDB
Es el almacenamiento basado en ACID, predeterminado en la versión 8.0.
MyISAM
Maneja tablas no transaccionales, bloqueo a nivel tabla e índices de búsqueda de texto
completo.
Federated
Permite el acceso a datos en tablas de base de datos remotas.
Memory
Maneja las tablas y datos en memoria.
mysql> show engines \G
MySQL 8.0
Diccionario de datos
Diccionario de datos transaccionales sobre los objetos de la base de datos.
Previamente se almacenaban en archivos de metadatos.
Sentencias de definición de datos atómicos (DDL atómico)
Actualización del diccionario de datos + operación motor de almacenamiento + escrituras de
registros binarios asociadas con la operación DDL en una sola transacción atómica.
Procesamiento de actualización
Automatizado, ya no lo realiza el DBA con mysql_upgrade.
Mejoras en la seguridad y gestión de cuentas
Administración de recursos
Creación y gestión de grupos de recursos.
Gestión de cifrado de tablas
MySQL | instalación y configuración
Next
MySQL | Instalación y Configuración
Next
MySQL | Instalación y Configuración
Execute
MySQL | Instalación y Configuración
Execute Next
MySQL | Instalación y Configuración
Next
MySQL | Instalación y Configuración
3306
33060
Next
MySQL | Instalación y Configuración
Next
MySQL | Instalación y Configuración
MySQL | Instalación y Configuración
Next
MySQL | Instalación y Configuración
Next
MySQL | Instalación y Configuración
Execute
MySQL | Instalación y Configuración
Finish
MySQL | Instalación y Configuración
Next
MySQL | Instalación y Configuración
Next
Verificar
MySQL | Instalación y Configuración
Finish
Execute
MySQL | Instalación y Configuración
Next
MySQL | Instalación y Configuración
Finish
MySQL | Workbench
Workbench es la interface gráfica de usuario de MySQL que permite diseñar, crear y
manejar tus esquemas de base de datos y objetos, así como los datos en sí mismos y
ejecutar directamente código SQL, tiene muchas funciones adicionales.
MySQL | Shell
MySQL Shell es una herramienta de línea de comandos y una interfaz de línea de
comandos para interactuar con la de base de datos MySQL. Fue introducido como una
herramienta unificada en MySQL 8.0 y tiene muchas funcionalidades.
MySQL | Comandos net y sc
MySQL | Archivo my.ini o my.cnf
my.ini es un archivo de configuración utilizado en la base de datos MySQL, en Linux se llama my.cnf.
Ubicado en c:\ProgramData\MySQL\MySQL Server 8.0\my.ini o en Linux en /etc/my.cnf
Tiene diferentes parámetros de configuración como:
Puerto de servicio.
Conjunto de caracteres por defecto.
El motor de almacenamiento por defecto.
Parámetro para establecer la rigurosidad de la instrucción SQL.
Máximo número de conexiones.
El tamaño de la memoria caché en el momento de la consulta.
El total de tablas abiertas por todos los procesos.
Número de tablas temporales en memoria.
Etc.
MySQL | Lenguajes y Conectores
// Deshabilitar el autocommit
conn.setAutoCommit(false);
Para la práctica de esta lección cambiaremos el archivo por una base de datos.
13.1 Usa los siguientes comandos para crear una base de datos con los mismos datos que
tenía el archivo.
• Crea un programa en Java que se llame CuentasDAO.java para cambiar la extracción de las
cuentas desde el archivo por la extracción de las cuentas desde la base de datos.
• Usa las clases Connection, Statement, ResultSet para realizar las tareas de conexión,
creación de la sentencia y ejecución de la siguiente sentencia sql: “SELECT * FROM
CUENTAS” para llevar a cabo la consulta de todos los datos que existen en la tabla.
13.3 Implementa las operaciones CRUD para la tabla de cuentas para llevar a cabo las
operaciones de creación, actualización y eliminación de cuentas.
Java JDBC API y su documentación
https://docs.oracle.com/javase/8/docs/technotes/gui
des/jdbc/
https://docs.oracle.com/javase/8/docs/technotes/gui
des/jdbc/jdbc_42.html
Creando una conexión con la Base de Datos
https://docs.oracle.com/javase/tutorial/jdbc/basics/c
onnecting.html
Atrapando excepciones tipo SQL
https://docs.oracle.com/javase/tutorial/jdbc/basics/s
qlexception.html
Referencias Usando Sentencias Preparadas
Bibliográficas https://docs.oracle.com/javase/tutorial/jdbc/basics/pr
epared.html
Capítulo 14. Uso de
Módulos en Java
Objetivos
En este capítulo aprenderás:
Una introducción a la programación modular con Java.
• Validar que todas las clases se puedan comunicar entre si a pesar de que se encuentren en
diferentes módulos.
Sugerencias: Utiliza la clase Scanner para recibir por el teclado cada una de las opciones
mencionadas, las cuales deberán ser validadas. Cada vez que se elija una opción deberá
limpiarse la pantalla y se presentará de nuevo el menú hasta que se elija la opción Salir. Usa
un ResourceBundle por cada idioma que maneje la aplicación.
Propiedades
https://docs.oracle.com/javase/tutorial/essential/envi
ronment/properties.html
Clase Locale
https://docs.oracle.com/en/java/javase/16/docs/api/j
ava.base/java/util/Locale.html
Creación de un Locale
https://docs.oracle.com/javase/tutorial/i18n/locale/cr
eate.html
Clase ResourceBoundle
Referencias https://docs.oracle.com/javase/tutorial/i18n/resbundl
Bibliográficas e/concept.html
Capítulo 16. Codificación
Segura en Java
Objetivos
Después de completar este capítulo podrás:
Describir la seguridad de Java SE.
Explicar las vulnerabilidades del código.
Describir las buenas prácticas y los antipatrones.
Introducción a la seguridad de Java SE
El lenguaje de Java y la máquina virtual proveen muchas
características que nos ayudan a mitigar errores comunes en la
programación.
El lenguaje es “Type-safe”, y la ejecución provee una administración
automática de la memoria (Garbage Collector).
Para minimizar los problemas de seguridad se pueden usar guías que nos
recomienda buenas prácticas.
Codificación segura en Java
La codificación segura en Java provee una serie de buenas prácticas
que podemos seguir para lograr que nuestro código sea más seguro.
Buenas prácticas
0 Fundamentos.
1 Negación de servicio.
2 Información confidencial.
3 Inyección e inclusión.
4 Accesibilidad y extensibilidad.
5 Validación de entradas.
6 Mutabilidad.
7 Construcción de objetos.
8 Serialización y deserialización.
9 Control de acceso.
¿Qué es una vulnerabilidad?
Definición:
Es un flujo o debilidad que puede ser explotada para violar las políticas de
seguridad.
Causas:
Diseño.
Implementaciones.
Errores en la configuración.
¿Qué es un antipatrón?
Un antipatrón es una mala práctica en la programación que deberías
evitar.
Pueden parecer beneficiosos en un inicio, pero pueden causar
consecuencias a largo plazo.
Un ejemplo de esto es la implementación de código rápido en el que no se
hagan validaciones de código.
El uso frecuente del copy/paste en el código.
Antipatrones en Java
Negligencia al verificar un formato de entrada.
Entrega de permisos innecesarios en el código.
Mal uso de las variables públicas y estáticas.
Ignorar cambios en las superclases.
Asumir que las excepciones son inofensivas.
Asumir que el espacio de valores de los enteros es ilimitado.
Asumir que una excepción en un constructor destruye el objeto.
Fundamentos
Fundamentos
0 Prefiero tener fallas obvias en lugar de no tener obvias fallas.
1 Diseña APIS para evitar problemas de seguridad.
2 Evita la duplicidad.
3 Privilegios restrictivos.
4 Establece límites de confianza.
5 Minimiza la cantidad de validaciones de permisos.
6 Encapsula métodos, atributos y clases.
Negación de servicio
La entrada en un sistema debe verificarse para que no cause un
consumo excesivo de recursos para solicitar el servicio.
Los recursos comunes más afectados son CPU, RAM, espacio en
disco.
Negación del servicio
1-1 Cuidar las actividades que puedan
usar una gran cantidad de recursos.
1-2 Liberar los recursos usados en todos
los casos.
1-3 Limitación de recursos que valide que
no exista un desbordamiento de
memoria.
Información Confidencial
Los datos confidenciales deben ser leídos en el contexto en el que se
usen.
Los datos que sean de confianza no deben exponerse para la
manipulación.
El código privilegiado no debe ser ejecutable a través de una interfaz.
Información confidencial
1 Se debe quitar información sensible de las excepciones.
2 No registres información altamente sensible.
3 Considera purgar la información altamente sensible de la
memoria después de su uso.
Inyección e inclusión
Una forma muy común de ataque implica hacer que un programa en
particular interprete los datos elaborados de tal manera que cause un
cambio de control imprevisto, normalmente, pero no siempre, esto
implica formatos de texto.
Inyección e inclusión
1 Generar un formato válido.
2 Evita el SQL dinámico.
3 La generación de XML y HTML requiere cuidado.
4 Evita cualquier dato que no sea de confianza en la línea de comandos.
5 Restringe la inclusión XML.
6 Ten cuidado con archivos BMP.
7 Desactiva la visualización HTML en componentes Swing.
8 Ten cuidado al interpretar código que no es de confianza.
9 Evita la inyección de valores excepcionales de punto flotante.
Accesibilidad y extensibilidad
La tarea de asegurar un sistema se hace más fácil al reducir la
"superficie de ataque" del código.
Accesibilidad y extensibilidad
1 Limitar la accesibilidad de clases, interfaces, métodos y campos.
2 Utilizar módulos para ocultar paquetes internos.
3 Aislar código no relacionado.
4 Limitar la exposición de las instancias de ClassLoader.
5 Limitar la extensibilidad de clases y métodos.
6 Comprender cómo una superclase puede afectar el comportamiento
de la subclase.
Validación de entrada
Una característica de la cultura de Java es que se utiliza una
verificación rigurosa de los parámetros del método para mejorar la
solidez. En términos más generales, la validación de entradas externas
es una parte importante de la seguridad.
Validación de entrada
1 Validar entradas.
2 Validar la salida de objetos que no son de confianza como entrada.
3 Definir contenedores alrededor de métodos nativos.
4 Verificar el comportamiento de la API en relación con la validación de
entrada.
Mutabilidad
La mutabilidad, aunque parece inocua, puede causar una
sorprendente variedad de problemas de seguridad.
Los ejemplos de esta sección se utilizan en java.util.Date ampliamente,
ya que es un ejemplo de una clase de API mutable.
En una aplicación, sería preferible utilizar la nueva API de fecha y hora
de Java ( java.time.*) que ha sido diseñada para ser inmutable.
Mutabilidad
1 Preferir inmutabilidad para tipos de valor.
2 Crear copias de valores de salida mutables.
3 Crear copias seguras de valores de entrada mutables y subclasificables.
4 Funcionalidad de copia de soporte para una clase mutable.
5 No confiar en la igualdad de identidad cuando se anule en objetos de referencia de entrada.
6 Tratar el paso de entrada a un objeto que no es de confianza como salida.
7 Tratar la salida de un objeto que no es de confianza como entrada.
8 Definir métodos de contenedor como entorno al estado interno modificable.
9 Hacer que los campos estáticos públicos sean finales.
10 Asegurar que los valores de campo finales estáticos públicos sean constantes.
11 No exponer estáticas mutables.
12 No exponer colecciones modificables.
Construcción de objetos
Durante la construcción, los objetos se encuentran en una etapa
incómoda donde existen, pero no están listos para su uso, tal situación
presenta algunas dificultades más, además de las de los métodos
ordinarios.
Construcción de objetos
1 Evitar exponer constructores de clases sensibles.
2 Evitar la construcción no autorizada de clases sensibles.
3 Defensa contra instancias parcialmente inicializadas de clases no
finales.
4 Impedir que los constructores llamen a métodos que se pueden
anular.
5 Defensa contra la clonación de clases no finales.
Serialización y Deserialización
En Java la Serialization proporciona una interfaz para las clases que
eluden los mecanismos de control de acceso a campos del lenguaje
Java, como resultado, se debe tener cuidado al realizar la serialización
y la deserialización.
Además, la deserialización de datos que no son de confianza debe
evitarse siempre que sea posible y debe realizarse con cuidado
cuando no pueda evitarse.
Serialización y Deserialización
Serialización y Deserialización
1 Evitar la serialización para clases sensibles a la seguridad.
2 Proteger datos confidenciales durante la serialización.
3 Ver la deserialización igual que la construcción de objetos.
4 Duplicar las comprobaciones relacionadas con la seguridad realizadas en una clase durante la
serialización y deserialización.
5 Comprender los permisos de seguridad otorgados a la serialización y deserialización.
6 Filtrar datos seriales no confiables.
Control de acceso
Aunque Java es en gran medida un lenguaje de capacidad de objetos,
se utiliza un mecanismo de control de acceso basado en pilas para
proporcionar APIs más convencionales de forma segura.
Resumen del capítulo
Java SE aborda la seguridad a través de políticas de seguridad, controles de
acceso, clases y APIs seguras, así como con actualizaciones regulares,
configuración personalizable y una variedad de herramientas y prácticas de
seguridad. Es importante que los desarrolladores y administradores de
sistemas sigan las mejores prácticas de seguridad al diseñar, desarrollar y
ejecutar aplicaciones Java para garantizar un entorno seguro y protegido.
Evaluación Práctica 16
Se requiere validar si nuestra aplicación cumple con las directrices y buenas prácticas de
seguridad recomendadas para Java.
16.3. ¿Se requieren cambios en el proyecto para mejorar la seguridad?. Explica tu respuesta.
Secure Coding Guidelines for Java SE
https://www.oracle.com/java/technologies/javase/se
ccodeguide.html
Referencias
Bibliográficas
Capítulo 17. Maven
Objetivos
Después de completar este capítulo podrás:
Describir que es Maven y su uso.
Descargar e instalar Maven.
Conocer la organización de archivos de un proyecto.
Saber el uso y estructura de los archivos de configuración de Maven.
Revisar las fases de construcción de un proyecto.
Aprender el manejo de las dependencias.
Crear un proyecto básico con Maven.
Maven
Es una herramienta Open Source desarrollada en Java por la Apache
Software Foundation.
El objetivo de esta herramienta es facilitar y estandarizar la
organización y la construcción de proyectos de software,
principalmente para proyectos destinados a la máquina virtual de Java.
Simplifica las tareas de compilación y construcción de aplicaciones de
software.
Incorpora una administración de dependencias con acceso a los
repositorios públicos de Maven con millones de librerías disponibles
incluyendo todas las versiones de cada una de ellas.
Instalación
Accede a la página oficial del proyecto Maven
https://maven.apache.org/ y descarga la última versión estable, esta
se ofrece en varios formatos y plataformas, aquella que tiene la
extensión Zip será suficiente en la mayoría de los casos.
En Windows se puede utilizar el instalador que realiza la instalación y
configuración automática en el sistema operativo.
Si la configuración es correcta, desde una terminal de comandos
puedes invocar a Maven a modo de prueba con la siguiente instrucción:
mvn -version
Puedes dar el comando mvn –help para ver las opciones disponibles.
Organización de archivos
Estructura de directorios y archivos
Maven define que todo proyecto Java, ya sea para construir una librería
o para una aplicación, debe tener la siguiente estructura de directorios en
el sistema de archivos:
pom.xml: Archivo de descripción, ubicado en la raíz del proyecto. En él se
indica su nombre, la ubicación que tendrá éste en el repositorio de binarios,
las dependencias que necesita para compilar, para ejecutar o para lanzar los
test. También se especifica si se hará uso de plugins.
src/main/java: Directorio en donde se ubicarán los archivos Java del
proyecto que serán compilados y formarán parte del binario resultante. A
partir de ese directorio es donde se tendrán en cuenta los paquetes de los
archivos Java. Por ejemplo, el archivo fuente de la clase
org.proyecto.Persona se ubicará en src/main/java/org/proyecto/Persona.java.
Estructura de directorios y archivos
src/main/resources: Permite añadir recursos que también se
incorporarán dentro del binario resultante, pero que no deben ser
compilados. Por ejemplo, los archivos con extensión .properties, XML
o imágenes.
src/test/java: Directorio para colocar las fuentes Java que únicamente
se usarán en la ejecución de los test unitarios. El contenido de este
directorio no será empaquetado en el binario final.
src/test/resources: Necesario si para la ejecución de los tests se
utilizan otros recursos como archivos XML o CSV con datos de prueba
para verificar los algoritmos. Los archivos incluidos no serán
empaquetados en el contenido final.
Estructura de directorios y archivos
target/classes: En este directorio se almacenarán las clases Java
resultantes de la compilación de las fuentes almacenadas en
src/main/java.
target/<proyecto.jar>: Típicamente los proyectos generarán un
binario con el contenido de target/classes más src/main/resources en
un único archivo empaquetado con extensión jar. Si el proyecto es una
aplicación, éste contendrá además todas las dependencias dentro de
él para que se disponga de todo lo necesario a la hora de ejecutar la
aplicación, formando un archivo denominado fat-jar.
Fases de Construcción
Una vez definido cómo deben organizarse los archivos fuente que
constituyen un proyecto, el siguiente paso es invocar a Maven para que
pueda realizar el proceso de construcción del proyecto.
Maven tiene presente las dependencias entre módulos que puede haber, así
que, si se trata de un proyecto modular, el orden de construcción de los
módulos se realizará en el orden correcto que permita satisfacer las
dependencias.
La construcción de cada módulo individual se realiza de la misma manera
que se hace sobre un proyecto simple, por tanto, ya sea para un módulo o
para un proyecto simple, Maven tratará de construir el módulo o proyecto,
pasando siempre por las siguientes fases en el orden que se indica a
continuación en la siguiente diapositiva:
Fases de Construcción
validate: Valida que el proyecto sea correcto y que toda la información
necesaria esté disponible según la especificación de los POMs.
compile: Compila el código fuente del proyecto revisando todos los
directorios src/main/java, alojando los archivos .class en
target/classes.
test: Prueba el código fuente compilado utilizando el marco de prueba
unitario indicado en el POM, normalmente JUnit. En esta fase se lanza
la ejecución de todos los tests. Si el resultado de alguno de ellos no es
correcto se interrumpe la construcción.
package: Recoge el código compilado y lo empaqueta en su formato
distribuible, normalmente como un archivo del tipo <application>.jar.
Fases de Construcción
verify: Ejecuta cualquier comprobación de los resultados de las
pruebas de integración para garantizar que se cumplan los criterios de
calidad.
install: Instala el paquete en el repositorio local, para usarlo como
dependencia en otros proyectos locales.
deploy: Copia el binario construido en el repositorio remoto, para
compartirlo con otros desarrolladores y proyectos. Esta fase requiere
que se indique la URL del repositorio donde desplegar, así como
también las credenciales a usar en caso necesario.
Fases de Construcción
clean: (opcional) Si se invoca manualmente, Maven eliminará todos
los recursos generados durante la compilación y el empaquetado,
borrando el directorio target.
site: (opcional) Produce un informe en HTML acerca del proyecto
mostrando la documentación de la API de Javadoc y estadísticas
según las herramientas de análisis que se hayan configurado.
Ejemplos de comandos en Maven
Manejo de Dependencias
Maven viene con unos repositorios públicos donde se despliegan la
mayoría de las librerías Open Source del ecosistema de Java, para
hacer uso de cualquiera, bastará con indicar una nueva dependencia
en el POM del proyecto.
Referencias
Bibliográficas
Capítulo 18. Optimización
y Depuración en Java
Objetivos
Después de completar este capítulo podrás:
Describir que es Depuración y Optimización de un programa en Java.
Aprender a utilizar el depurador que viene integrado en Netbeans.
Aprender a utilizar el perfilador que viene integrado en Netbeans.
Optimización y Depuración en Java
La optimización y depuración son dos aspectos fundamentales en el
desarrollo de aplicaciones en Java para garantizar que el software
funcione de manera eficiente y sin errores.
Optimización en Java:
18.2 Utilizando el Perfilador (Profiler) de Netbeans, observa y evalúa los recursos que
está utilizando la aplicación de BancaElectronica, como es uso de memoria, hilos en
ejecución, etc.
¿Qué deduces de lo observado y analizado?. Elabora un resumen con tus
conclusiones.
Depuración de programas con NetBeans
https://javiergarciaescobedo.es/programacion-en-
java/28-programacion-estructurada/114-depuracion-
de-programas-con-netbeans
Profiling de Java en NetBeans
https://omniumpotentior.wordpress.com/2009/08/23/
profiling-de-java-en-netbeans/
Referencias
Bibliográficas
¡Gracias!
¿Dudas o comentarios?