Java Platform, Standard Edition ( Java SE ) es una plataforma informática para el desarrollo e implementación de código portátil para entornos de escritorio y servidor . [1] Java SE se conocía anteriormente como plataforma Java 2, edición estándar ( J2SE ).
La plataforma utiliza el lenguaje de programación Java y forma parte de la familia de plataformas de software Java . Java SE define una variedad de API de propósito general , como las API de Java para la biblioteca de clases de Java , y también incluye la especificación del lenguaje Java y la especificación de la máquina virtual Java . [2] OpenJDK es la implementación oficial de referencia desde la versión 7. [3] [4] [5]
La plataforma se conocía como Java 2 Platform, Standard Edition o J2SE desde la versión 1.2, hasta que se cambió el nombre a Java Platform, Standard Edition o Java SE en la versión 1.5. El "SE" se utiliza para distinguir la plataforma base de las plataformas Enterprise Edition ( Java EE ) y Micro Edition ( Java ME ). El "2" originalmente tenía como objetivo enfatizar los cambios principales introducidos en la versión 1.2, pero se eliminó en la versión 1.6. La convención de nomenclatura ha cambiado varias veces a lo largo del historial de versiones de Java . A partir de J2SE 1.4 (Merlin), Java SE se desarrolló bajo el Proceso de la comunidad Java , que produce descripciones de las especificaciones propuestas y finales para la plataforma Java denominada Solicitudes de especificación Java (JSR) . [6] JSR 59 fue la especificación general para J2SE 1.4 y JSR 176 especificó J2SE 5.0 (Tiger). Java SE 6 (Mustang) se lanzó bajo JSR 270.
Java Platform, Enterprise Edition (Java EE) es una especificación relacionada que incluye todas las clases de Java SE, además de algunas que son más útiles para programas que se ejecutan en servidores que en estaciones de trabajo .
Java Platform, Micro Edition (Java ME) es una especificación relacionada destinada a proporcionar una colección certificada de API de Java para el desarrollo de software para dispositivos pequeños con recursos limitados, como teléfonos móviles , PDA y decodificadores .
Java Runtime Environment (JRE) y Java Development Kit (JDK) son los archivos reales descargados e instalados en una computadora para ejecutar o desarrollar programas Java, respectivamente.
El paquete Java contiene clases e interfacesjava.lang
fundamentales estrechamente vinculadas al lenguaje y al sistema de ejecución . Esto incluye las clases raíz que forman la jerarquía de clases , tipos vinculados a la definición del lenguaje, excepciones básicas , funciones matemáticas, subprocesos , funciones de seguridad, así como cierta información sobre el sistema nativo subyacente. Este paquete contiene 22 de las 32 clases proporcionadas en JDK 6.Error
Las principales clases e interfaces java.lang
son:
Object
– la clase que es la raíz de toda jerarquía de clases.Enum
– la clase base para las clases de enumeración (a partir de J2SE 5.0).Class
– la clase que es la raíz del sistema de reflexión de Java .Throwable
– la clase que es la clase base de la jerarquía de clases de excepción.Error
, Exception
y RuntimeException
– las clases base para cada tipo de excepción.Thread
– la clase que permite operaciones sobre subprocesos.String
– la clase para cadenas y literales de cadena .StringBuffer
y StringBuilder
– clases para realizar manipulación de cadenas ( StringBuilder
a partir de J2SE 5.0).Comparable
– la interfaz que permite la comparación y ordenación genérica de objetos (a partir de J2SE 1.2).Iterable
– la interfaz que permite la iteración genérica utilizando el bucle mejoradofor
(a partir de J2SE 5.0).ClassLoader
, Process
, Runtime
, SecurityManager
y System
– clases que proporcionan "operaciones del sistema" que gestionan la carga dinámica de clases, la creación de procesos externos , consultas del entorno del host, como la hora del día, y la aplicación de políticas de seguridad .Math
y StrictMath
– clases que proporcionan funciones matemáticas básicas como seno , coseno y raíz cuadrada ( StrictMath
a partir de J2SE 1.3).Las clases en java.lang
se importan automáticamente a cada archivo fuente .
El java.lang.ref
paquete proporciona tipos de referencias más flexibles que los que están disponibles de otro modo, lo que permite una interacción limitada entre la aplicación y el recolector de basura de la máquina virtual Java (JVM) . Es un paquete importante, lo suficientemente central para el lenguaje como para que los diseñadores del lenguaje le den un nombre que comience con "java.lang", pero tiene un propósito algo especial y no lo utilizan muchos desarrolladores. Este paquete se agregó en J2SE 1.2.
Java tiene un expresivo sistema de referencias y permite un comportamiento especial para la recolección de basura. Una referencia normal en Java se conoce como "referencia fuerte". El java.lang.ref
paquete define otros tres tipos de referencias: referencias suaves, débiles y fantasmas. Cada tipo de referencia está diseñada para un uso específico.
SoftReference
se puede utilizar para implementar un caché . Un objeto al que no se puede acceder mediante una referencia fuerte (es decir, que no se puede alcanzar con fuerza), pero al que se hace referencia mediante una referencia suave se denomina "alcanzable suavemente". Un objeto de fácil acceso puede ser recolectado como basura a discreción del recolector de basura. Esto generalmente significa que los objetos a los que se puede acceder suavemente solo se recolectan como basura cuando la memoria libre es baja, pero nuevamente, esto queda a discreción del recolector de basura. Semánticamente, una referencia suave significa "Conservar este objeto cuando nada más haga referencia a él, a menos que se necesite memoria".WeakReference
se utiliza para implementar mapas débiles. Un objeto que no es alcanzable de manera fuerte o suave, pero al que se hace referencia mediante una referencia débil se denomina " alcanzable débilmente ". Un objeto de difícil acceso se recolecta como basura en el siguiente ciclo de recolección. Este comportamiento se utiliza en la clase java.util.WeakHashMap
. Un mapa débil permite al programador colocar pares clave/valor en el mapa y no preocuparse de que los objetos ocupen memoria cuando ya no se pueda acceder a la clave en ningún otro lugar. Otra posible aplicación de referencias débiles es el grupo de internos de cadenas . Semánticamente, una referencia débil significa "deshacerse de este objeto cuando nada más haga referencia a él en la próxima recolección de basura".PhantomReference
se utiliza para hacer referencia a objetos que se han marcado para la recolección de basura y se han finalizado , pero que aún no se han recuperado. Un objeto al que no se puede acceder de forma fuerte, suave o débil, pero al que se hace referencia mediante una referencia fantasma se denomina "alcanzable fantasma". Esto permite una limpieza más flexible de la que es posible con el mecanismo de finalización solo. Semánticamente, una referencia fantasma significa "este objeto ya no es necesario y se ha finalizado en preparación para su recopilación".Cada uno de estos tipos de referencia extiende la Reference
clase, que proporciona el get()
método para devolver una referencia fuerte al objeto de referencia (o null
si la referencia se ha borrado o si el tipo de referencia es fantasma) y el clear()
método para borrar la referencia.
java.lang.ref
También define la clase , ReferenceQueue
que se puede utilizar en cada una de las aplicaciones analizadas anteriormente para realizar un seguimiento de los objetos que han cambiado de tipo de referencia. Cuando Reference
se crea, opcionalmente se registra con una cola de referencia. La aplicación sondea la cola de referencias para obtener referencias que hayan cambiado el estado de accesibilidad.
La reflexión es un componente de la API de Java que permite que el código Java examine y "refleje" los componentes de Java en tiempo de ejecución y utilice los miembros reflejados. Clases en el java.lang.reflect
paquete, junto con java.lang.Class
aplicaciones java.lang.Package
como depuradores , intérpretes , inspectores de objetos, navegadores de clases y servicios como serialización de objetos y JavaBeans que necesitan acceso a los miembros públicos de un objeto de destino (según su clase de tiempo de ejecución) o los miembros declarados por una clase determinada. Este paquete se agregó en JDK 1.1.
La reflexión se utiliza para crear instancias de clases e invocar métodos usando sus nombres, un concepto que permite la programación dinámica. Las clases, interfaces, métodos, campos y constructores se pueden descubrir y utilizar en tiempo de ejecución. La reflexión está respaldada por metadatos que la JVM tiene sobre el programa.
Existen técnicas básicas involucradas en la reflexión:
El descubrimiento normalmente comienza con un objeto y llama al Object.getClass()
método para obtener el valor del objeto Class
. El Class
objeto tiene varios métodos para descubrir el contenido de la clase, por ejemplo:
getMethods()
– devuelve una matriz de Method
objetos que representan todos los métodos públicos de la clase o interfazgetConstructors()
– devuelve una matriz de Constructor
objetos que representan todos los constructores públicos de la clasegetFields()
– devuelve una matriz de Field
objetos que representan todos los campos públicos de la clase o interfazgetClasses()
– devuelve una matriz de Class
objetos que representan todas las clases e interfaces públicas que son miembros (por ejemplo, clases internas ) de la clase o interfazgetSuperclass()
– devuelve el Class
objeto que representa la superclase de la clase o interfaz ( null
se devuelve para interfaces)getInterfaces()
– devuelve una matriz de Class
objetos que representan todas las interfaces implementadas por la clase o interfazEl Class
objeto se puede obtener mediante descubrimiento, utilizando el literal de clase (p. ej. MyClass.class
) o utilizando el nombre de la clase (p. ej Class.forName("mypackage.MyClass")
.). Con un Class
objeto, miembro Method
, Constructor
u Field
objetos se pueden obtener usando el nombre simbólico del miembro. Por ejemplo:
getMethod("methodName", Class...)
– devuelve el Method
objeto que representa el método público con el nombre "methodName" de la clase o interfaz que acepta los parámetros especificados por los Class...
parámetros.getConstructor(Class...)
– devuelve el Constructor
objeto que representa el constructor público de la clase que acepta los parámetros especificados por los Class...
parámetros.getField("fieldName")
– devuelve el Field
objeto que representa el campo público con el nombre "fieldName" de la clase o interfaz.Method
Los objetos , Constructor
y Field
se pueden utilizar para acceder dinámicamente al miembro representado de la clase. Por ejemplo:
Field.get(Object)
– devuelve un Object
que contiene el valor del campo de la instancia del objeto pasado a get()
. (Si el Field
objeto representa un campo estático, entonces el Object
parámetro se ignora y puede ser null
.)Method.invoke(Object, Object...)
– devuelve un Object
que contiene el resultado de invocar el método para la instancia del primer Object
parámetro pasado a invoke()
. Los parámetros restantes Object...
se pasan al método. (Si el Method
objeto representa un método estático , entonces el primer Object
parámetro se ignora y puede ser null
.)Constructor.newInstance(Object...)
– devuelve la nueva Object
instancia al invocar al constructor. Los Object...
parámetros se pasan al constructor. (Tenga en cuenta que el constructor sin parámetros de una clase también se puede invocar llamando a newInstance()
).El java.lang.reflect
paquete también proporciona una Array
clase que contiene métodos estáticos para crear y manipular objetos de matriz y, desde J2SE 1.3, una Proxy
clase que admite la creación dinámica de clases proxy que implementan interfaces específicas.
La implementación de una Proxy
clase la proporciona un objeto proporcionado que implementa la InvocationHandler
interfaz. El InvocationHandler
método invoke(Object, Method, Object[])
se llama para cada método invocado en el objeto proxy: el primer parámetro es el objeto proxy, el segundo parámetro es el Method
objeto que representa el método de la interfaz implementada por el proxy y el tercer parámetro es la matriz de parámetros pasados. al método de interfaz. El invoke()
método devuelve un Object
resultado que contiene el resultado devuelto al código que llamó al método de interfaz proxy.
El java.io
paquete contiene clases que admiten entrada y salida . Las clases del paquete están principalmente orientadas a flujos ; sin embargo, también se proporciona una clase para archivos de acceso aleatorio . Las clases centrales del paquete son y , que son clases base abstractas para leer y escribir en flujos de bytes , respectivamente. Las clases relacionadas y son clases base abstractas para leer y escribir en flujos de caracteres , respectivamente. El paquete también tiene algunas clases diversas para soportar interacciones con el sistema de archivos del host .InputStream
OutputStream
Reader
Writer
Las clases de flujo siguen el patrón decorador al extender la subclase base para agregar características a las clases de flujo. Las subclases de las clases de flujo base normalmente reciben nombres de uno de los siguientes atributos:
Las subclases de flujo se nombran utilizando el patrón XxxStreamType
de nomenclatura donde Xxx
es el nombre que describe la característica y StreamType
es uno de InputStream
, OutputStream
, Reader
o Writer
.
La siguiente tabla muestra los orígenes/destinos admitidos directamente por el java.io
paquete:
Otros paquetes de biblioteca estándar proporcionan implementaciones de flujo para otros destinos, como el InputStream
devuelto por el java.net.Socket.getInputStream()
método o la clase Java EE javax.servlet.ServletOutputStream
.
El manejo y procesamiento de tipos de datos o filtrado de datos de flujo se logra a través de filtros de flujo . Todas las clases de filtro aceptan otro objeto de flujo compatible como parámetro para el constructor y decoran el flujo adjunto con características adicionales. Los filtros se crean ampliando una de las clases de filtro base FilterInputStream
, FilterOutputStream
, FilterReader
o FilterWriter
.
Las clases Reader
y Writer
son en realidad solo flujos de bytes con procesamiento adicional realizado en el flujo de datos para convertir los bytes en caracteres. Utilizan la codificación de caracteres predeterminada para la plataforma, que a partir de J2SE 5.0 está representada por el método Charset
devuelto por el java.nio.charset.Charset.defaultCharset()
método estático. La InputStreamReader
clase convierte an InputStream
en a Reader
y la OutputStreamWriter
clase convierte an OutputStream
en a Writer
. Ambas clases tienen constructores que permiten especificar la codificación de caracteres que se utilizará. Si no se especifica ninguna codificación, el programa utiliza la codificación predeterminada para la plataforma.
La siguiente tabla muestra los otros procesos y filtros que el java.io
paquete admite directamente. Todas estas clases amplían la Filter
clase correspondiente.
La RandomAccessFile
clase admite la lectura y escritura de archivos con acceso aleatorio . La clase utiliza un puntero de archivo que representa un desplazamiento de bytes dentro del archivo para la siguiente operación de lectura o escritura. El puntero del archivo se mueve implícitamente mediante lectura o escritura y explícitamente llamando a los métodos seek(long)
o skipBytes(int)
. El método devuelve la posición actual del puntero del archivo getFilePointer()
.
La File
clase representa una ruta de archivo o directorio en un sistema de archivos . Los objetos admiten la creación, eliminación y cambio de nombre de archivos y directorios y la manipulación de atributos de archivos como solo lectura y marca de tiempo de la última modificación . Los objetos que representan directorios se pueden utilizar para obtener una lista de todos los archivos y directorios contenidos.File
File
La FileDescriptor
clase es un descriptor de archivo que representa una fuente o un sumidero (destino) de bytes. Normalmente es un archivo, pero también puede ser una consola o un socket de red . FileDescriptor
Los objetos se utilizan para crear File
secuencias. Se obtienen a partir de File
flujos, java.net
sockets y sockets de datagramas.
En J2SE 1.4, el paquete java.nio
(NIO o E/S sin bloqueo) se agregó para admitir E/S asignadas en memoria , lo que facilita las operaciones de E/S más cercanas al hardware subyacente con un rendimiento a veces dramáticamente mejor. El java.nio
paquete proporciona soporte para varios tipos de búfer. El subpaquete java.nio.charset
proporciona soporte para diferentes codificaciones de caracteres para datos de caracteres. El subpaquete java.nio.channels
proporciona soporte para canales, que representan conexiones a entidades que son capaces de realizar operaciones de E/S, como archivos y sockets. El java.nio.channels
paquete también brinda soporte para el bloqueo detallado de archivos.
El java.math
paquete admite aritmética de precisión múltiple (incluidas operaciones aritméticas modulares) y proporciona generadores de números primos de precisión múltiple utilizados para la generación de claves criptográficas. Las principales clases del paquete son:
BigDecimal
– proporciona números decimales con signo de precisión arbitraria. BigDecimal
le da al usuario control sobre el comportamiento de redondeo a través de RoundingMode
.BigInteger
– proporciona números enteros de precisión arbitraria. Las operaciones activadas BigInteger
no se desbordan ni pierden precisión. Además de las operaciones aritméticas estándar, proporciona aritmética modular , cálculo MCD , pruebas de primalidad , generación de números primos , manipulación de bits y otras operaciones diversas.MathContext
– encapsular la configuración de contexto que describe ciertas reglas para operadores numéricos.RoundingMode
– una enumeración que proporciona ocho comportamientos de redondeo.El java.net
paquete proporciona rutinas IO especiales para redes, lo que permite solicitudes HTTP , así como otras transacciones comunes.
El java.text
paquete implementa rutinas de análisis de cadenas y admite varios lenguajes legibles por humanos y análisis específicos de la configuración regional.
Las estructuras de datos que agregan objetos son el foco del java.util
paquete. En el paquete se incluye la API de colecciones , una jerarquía de estructura de datos organizada influenciada en gran medida por las consideraciones de patrones de diseño .
Creado para admitir la creación de subprogramas de Java , el java.applet
paquete permite descargar aplicaciones a través de una red y ejecutarlas dentro de un entorno limitado protegido. Las restricciones de seguridad se imponen fácilmente en el entorno sandbox. Un desarrollador, por ejemplo, puede aplicar una firma digital a un subprograma, etiquetándolo así como seguro. Hacerlo permite al usuario otorgar permiso al subprograma para realizar operaciones restringidas (como acceder al disco duro local) y elimina algunas o todas las restricciones de la zona de pruebas. Los certificados digitales son emitidos por autoridades certificadoras .
En el java.beans
paquete se incluyen varias clases para desarrollar y manipular beans, componentes reutilizables definidos por la arquitectura JavaBeans . La arquitectura proporciona mecanismos para manipular las propiedades de los componentes y activar eventos cuando esas propiedades cambian.
Las API en java.beans
están diseñadas para ser utilizadas por una herramienta de edición de beans, en la que los beans se pueden combinar, personalizar y manipular. Un tipo de editor de beans es un diseñador de GUI en un entorno de desarrollo integrado .
El java.awt
, o Abstract Window Toolkit, proporciona acceso a un conjunto básico de widgets GUI basados en el conjunto de widgets de la plataforma nativa subyacente, el núcleo del subsistema de eventos GUI y la interfaz entre el sistema de ventanas nativo y la aplicación Java. También proporciona varios administradores de diseño básicos , un paquete de transferencia de datos para usar con el Portapapeles y Arrastrar y soltar , la interfaz para dispositivos de entrada como ratones y teclados , así como acceso a la bandeja del sistema en sistemas compatibles. Este paquete, además, javax.swing
contiene la mayor cantidad de enumeraciones (7 en total) en JDK 6.
El java.rmi
paquete proporciona invocación de métodos remotos Java para admitir llamadas a procedimientos remotos entre dos aplicaciones Java que se ejecutan en diferentes JVM .
El paquete incluye soporte para seguridad, incluido el algoritmo de resumen de mensajes java.security
.
En el paquete se agrupa una implementación de la API JDBC (utilizada para acceder a bases de datos SQL ) .java.sql
El javax.rmi
paquete proporcionó soporte para la comunicación remota entre aplicaciones, utilizando el protocolo RMI sobre IIOP. Este protocolo combina funciones RMI y CORBA.
Tecnologías principales de Java SE: CORBA / RMI-IIOP
Swing es una colección de rutinas que se construyen para proporcionar un kit de herramientas de widgetsjava.awt
independiente de la plataforma . utiliza las rutinas de dibujo 2D para representar los componentes de la interfaz de usuario en lugar de depender del soporte GUI del sistema operativo nativo subyacente.javax.swing
Este paquete contiene la mayor cantidad de clases (133 en total) en JDK 6. Este paquete, además, java.awt
también contiene la mayor cantidad de enumeraciones (7 en total) en JDK 6. Admite apariencia y sensación conectables (PLAF) para que los widgets en la GUI pueden imitar los del sistema nativo subyacente. Los patrones de diseño impregnan el sistema, especialmente una modificación del patrón modelo-vista-controlador , que afloja el acoplamiento entre función y apariencia. Una inconsistencia es que (a partir de J2SE 1.3) las fuentes las dibuja el sistema nativo subyacente y no Java, lo que limita la portabilidad del texto. Existen soluciones alternativas, como el uso de fuentes de mapa de bits. En general, se utilizan "diseños" y mantienen los elementos dentro de una GUI estéticamente consistente en todas las plataformas.
El javax.swing.text.html.parser
paquete proporciona el analizador HTML tolerante a errores que se utiliza para escribir varios navegadores web y robots web.
El javax.xml.bind.annotation
paquete contenía la mayor cantidad de tipos de anotaciones (30 en total) en JDK 6. Define anotaciones para personalizar elementos de programas Java para el mapeo de esquemas XML.
El org.omg.CORBA
paquete proporcionó soporte para la comunicación remota entre aplicaciones que utilizan el protocolo general Inter-ORB y admite otras características de la arquitectura del intermediario de solicitud de objetos común . Al igual que RMI y RMI-IIOP , este paquete sirve para llamar a métodos remotos de objetos en otras máquinas virtuales (normalmente a través de la red).
Este paquete contenía la mayor cantidad de Exception
clases (45 en total) en JDK 6. De todas las posibilidades de comunicación, CORBA es portátil entre varios idiomas; sin embargo, esto conlleva una mayor complejidad.
Estos paquetes quedaron obsoletos en Java 9 y eliminados de Java 11. [7]
El org.omg.PortableInterceptor
paquete contenía la mayor cantidad de interfaces (39 en total) en JDK 6. Proporciona un mecanismo para registrar ganchos ORB a través de los cuales los servicios ORB interceptan el flujo normal de ejecución del ORB.
Se han informado varias vulnerabilidades de seguridad críticas. [8] [9] Las alertas de seguridad de Oracle anuncian parches críticos relacionados con la seguridad para Java SE. [10]