Java Platform, Standard Edition ( Java SE ) es una plataforma informática para el desarrollo e implementación de código portable para entornos de escritorio y servidor . [1] Java SE era anteriormente conocido como Java 2 Platform, Standard Edition ( 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 serie de API de propósito general (como las API de Java para la biblioteca de clases 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 de referencia oficial 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 el nombre se cambió 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 la intención de 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 se ha cambiado varias veces a lo largo del historial de versiones de Java . A partir de J2SE 1.4 (Merlin), Java SE se ha desarrollado bajo el Java Community Process , que produce descripciones de especificaciones propuestas y finales para la plataforma Java llamadas Java Specification Requests (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, más una serie de clases que son más útiles para programas que se ejecutan en servidores en lugar de 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 celulares , PDA y decodificadores .
Java Runtime Environment (JRE) y Java Development Kit (JDK) son los archivos reales que se descargan e instalan 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 , los tipos vinculados a la definición del lenguaje, las excepciones básicas , las funciones matemáticas, el subprocesamiento , las funciones de seguridad, así como 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 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 en 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 administran la carga dinámica de clases, la creación de procesos externos , las 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 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 se encuentran disponibles de otro modo, lo que permite una interacción limitada entre la aplicación y el recolector de elementos no utilizados 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 un tanto especial y no lo utilizan muchos desarrolladores. Este paquete se agregó en J2SE 1.2.
Java tiene un sistema expresivo 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ñado para un uso específico.
SoftReference
Se puede utilizar A para implementar una caché . Un objeto al que no se puede acceder mediante una referencia fuerte (es decir, no se puede acceder con fuerza), pero al que se hace referencia mediante una referencia blanda, se denomina "alcance suave". Un objeto al que se puede acceder suave puede ser objeto de recolección de basura a discreción del recolector de basura. Esto generalmente significa que los objetos a los que se puede acceder suave solo se recolectan cuando la memoria libre es baja, pero nuevamente, esto queda a discreción del recolector de basura. Semánticamente, una referencia suave significa "Mantener este objeto cuando nada más lo referencia, a menos que se necesite la memoria".WeakReference
se utiliza para implementar mapas débiles. Un objeto que no es alcanzable de forma fuerte o suave, pero que es referenciado por una referencia débil se denomina " débilmente alcanzable ". Un objeto débilmente alcanzable 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 la clave ya no sea accesible en ningún otro lugar. Otra posible aplicación de las referencias débiles es el grupo interno de cadenas . Semánticamente, una referencia débil significa "deshazte de este objeto cuando nada más lo referencia en la siguiente 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 que no es alcanzable de forma fuerte, suave o débil, pero que es referenciado por 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 recolecció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 se ha borrado la referencia o si el tipo de referencia es fantasma) y el clear()
método para borrar la referencia.
También java.lang.ref
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 el tipo de referencia. Cuando Reference
se crea un objeto, se registra opcionalmente en una cola de referencias. La aplicación sondea la cola de referencias para obtener las referencias que han cambiado el estado de accesibilidad.
Reflection es un componente de la API de Java que permite que el código Java examine y "refleje" sobre los componentes de Java en tiempo de ejecución y utilice los miembros reflejados. Las clases del java.lang.reflect
paquete, junto con java.lang.Class
y java.lang.Package
admiten aplicaciones como depuradores , intérpretes , inspectores de objetos, exploradores 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 a 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 utilizando 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 se apoya en los metadatos que la JVM tiene sobre el programa.
Existen técnicas básicas implicadas en la reflexión:
El descubrimiento generalmente comienza con un objeto y llamando al Object.getClass()
método para obtener el contenido 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, se pueden obtener miembros Method
, Constructor
u Field
objetos utilizando 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
Se pueden utilizar objetos , Constructor
, y para acceder de forma dinámica al miembro representado de la clase. Por ejemplo:Field
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, 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 obtenida al invocar el 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 se realiza mediante un objeto suministrado que implementa la InvocationHandler
interfaz. El método InvocationHandler
's 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 la interfaz. El invoke()
método devuelve un Object
resultado que contiene el resultado devuelto al código que llamó al método de la interfaz proxy.
El java.io
paquete contiene clases que admiten entrada y salida . Las clases del paquete están principalmente orientadas a flujos de datos ; 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 admitir interacciones con el sistema de archivos del host .InputStream
OutputStream
Reader
Writer
Las clases de flujo siguen el patrón de decorador al extender la subclase base para agregar características a las clases de flujo. Las subclases de las clases de flujo base suelen recibir el nombre de uno de los siguientes atributos:
Las subclases de flujo se nombran utilizando el patrón XxxStreamType
de nombres donde Xxx
es el nombre que describe la característica y StreamType
es uno de InputStream
, OutputStream
, Reader
o Writer
.
La siguiente tabla muestra las fuentes/destinos soportados 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 método o la clase java.net.Socket.getInputStream()
Java EE .javax.servlet.ServletOutputStream
El manejo y procesamiento de tipos de datos o el filtrado de datos de flujo se logran 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 incluido 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 simplemente secuencias de bytes con un procesamiento adicional realizado en la secuencia 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 Charset
devuelto por el java.nio.charset.Charset.defaultCharset()
método estático. La InputStreamReader
clase convierte un InputStream
en un Reader
y la OutputStreamWriter
clase convierte un OutputStream
en un Writer
. Ambas clases tienen constructores que admiten la especificación de 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 demás procesos y filtros que el java.io
paquete admite directamente. Todas estas clases extienden la Filter
clase correspondiente.
La RandomAccessFile
clase admite la lectura y escritura de archivos mediante 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 de archivo se mueve de forma implícita al leer o escribir y de forma explícita al llamar a los métodos seek(long)
o skipBytes(int)
. El método devuelve la posición actual del puntero de 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 archivo, como solo lectura y marca de tiempo de última modificación . Los objetos que representan directorios se pueden usar 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 destino de bytes. Normalmente, se trata de un archivo, pero también puede ser una consola o un socket de red . FileDescriptor
Los objetos se utilizan para crear File
flujos. Se obtienen de File
flujos y java.net
sockets y sockets de datagramas.
En J2SE 1.4, java.nio
se agregó el paquete (NIO o Non-blocking I/O) para admitir E/S mapeadas en memoria , lo que facilita las operaciones de E/S más cercanas al hardware subyacente con un rendimiento a veces mucho 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 proporciona soporte para el bloqueo de archivos de grano fino.
El java.math
paquete admite operaciones aritméticas de precisión múltiple (incluidas las operaciones aritméticas modulares) y proporciona generadores de números primos de precisión múltiple que se utilizan para la generación de claves criptográficas. Las clases principales del paquete son:
BigDecimal
– proporciona números decimales con signo de precisión arbitraria. BigDecimal
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 en BigInteger
no se desbordan ni pierden precisión. Además de las operaciones aritméticas estándar, proporciona aritmética modular , cálculo de MCD , pruebas de primalidad , generación de números primos , manipulación de bits y otras operaciones diversas.MathContext
– encapsular las configuraciones de contexto que describen ciertas reglas para operadores numéricos.RoundingMode
– una enumeración que proporciona ocho comportamientos de redondeo.El java.net
paquete proporciona rutinas de E/S especiales para redes, permitiendo solicitudes HTTP , así como otras transacciones comunes.
El java.text
paquete implementa rutinas de análisis para cadenas y admite varios idiomas legibles por humanos y análisis específico de la configuración regional.
Las estructuras de datos que agregan objetos son el foco del java.util
paquete. El paquete incluye la API de colecciones , una jerarquía de estructuras de datos organizadas influenciada en gran medida por las consideraciones de los patrones de diseño .
Creado para respaldar la creación de subprogramas Java , el java.applet
paquete permite que las aplicaciones se descarguen a través de una red y se ejecuten dentro de un entorno protegido. Las restricciones de seguridad se imponen fácilmente en el entorno protegido. Un desarrollador, por ejemplo, puede aplicar una firma digital a un subprograma, etiquetándolo así como seguro. Al hacerlo, el usuario puede otorgarle permiso al subprograma para realizar operaciones restringidas (como acceder al disco duro local) y eliminar algunas o todas las restricciones del entorno protegido. Los certificados digitales son emitidos por autoridades de certificación .
El java.beans
paquete incluye varias clases para desarrollar y manipular beans, componentes reutilizables definidos por la arquitectura JavaBeans . La arquitectura proporciona mecanismos para manipular propiedades de componentes y activar eventos cuando esas propiedades cambian.
Las API de java.beans
están pensadas para que las utilice una herramienta de edición de beans, en la que se pueden combinar, personalizar y manipular los beans. Un tipo de editor de beans es un diseñador de GUI en un entorno de desarrollo integrado .
El java.awt
paquete de herramientas Abstract Window Toolkit proporciona acceso a un conjunto básico de widgets de GUI basados en el conjunto de widgets de la plataforma nativa subyacente, el núcleo del subsistema de eventos de 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, junto con javax.swing
contiene la mayor cantidad de enumeraciones (7 en total) en JDK 6.
El java.rmi
paquete proporciona invocación de método remoto Java para soportar llamadas a procedimientos remotos entre dos aplicaciones Java que se ejecutan en diferentes JVM .
java.security
El paquete incluye soporte para seguridad, incluido el algoritmo de resumen de mensajes .
Una implementación de la API JDBC (utilizada para acceder a bases de datos SQL ) se agrupa en el paquete.java.sql
El javax.rmi
paquete proporciona soporte para la comunicación remota entre aplicaciones, utilizando el protocolo RMI sobre IIOP. Este protocolo combina características RMI y CORBA.
Tecnologías principales de Java SE: CORBA / RMI-IIOP
Swing es una colección de rutinas que se basan java.awt
en proporcionar un conjunto de herramientas de widgets independiente de la plataforma . javax.swing
Utiliza las rutinas de dibujo 2D para representar los componentes de la interfaz de usuario en lugar de depender del soporte de la GUI del sistema operativo nativo subyacente .
Este paquete contiene la mayor cantidad de clases (133 en total) en JDK 6. Este paquete, junto con java.awt
también contiene la mayor cantidad de enumeraciones (7 en total) en JDK 6. Admite apariencias conectables (PLAF) para que los widgets en la GUI puedan imitar a los del sistema nativo subyacente. Los patrones de diseño permean 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 son dibujadas por el sistema nativo subyacente, y no por 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 se 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 bots web.
El javax.xml.bind.annotation
paquete contiene la mayor cantidad de tipos de anotaciones (30 en total) en JDK 6. Define anotaciones para personalizar los elementos del programa Java para la asignación de esquemas XML.
El org.omg.CORBA
paquete proporciona soporte para la comunicación remota entre aplicaciones que utilizan el Protocolo General Inter-ORB y admite otras características de la arquitectura de intermediario de solicitudes de objetos comunes . 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 portable entre varios lenguajes; sin embargo, esto conlleva una mayor complejidad.
Estos paquetes quedaron obsoletos en Java 9 y se eliminaron 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]