Plataforma Java, edición estándar

AjustarCompartirImprimirCitar

Java Platform, Standard Edition (Java SE) es una plataforma informática para el desarrollo y la implementación de código portátil para entornos de escritorio y servidor. Java SE se conocía anteriormente 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 gama de API de uso 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 de Java. OpenJDK es la implementación de referencia oficial desde la versión 7.

Nomenclatura, normas y especificaciones

La plataforma se conocía como Java 2 Platform, Standard Edition o J2SE a partir de 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 la intención de enfatizar los principales cambios 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. Comenzando con J2SE 1.4 (Merlin), Java SE ha sido desarrollado bajo el Proceso de la comunidad Java, que produce descripciones de las especificaciones propuestas y finales para la plataforma Java llamadas Solicitudes de especificación de Java (JSR). 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 en Java SE, además de un número que es más útil para los 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 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.

Paquetes de propósito general

Java.lang

El paquete Java java.lang contiene clases e interfaces fundamentales estrechamente vinculadas al lenguaje y al sistema de tiempo 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, los subprocesos, las funciones de seguridad, así como cierta información sobre el sistema nativo subyacente. Este paquete contiene 22 de las 32 clases Error provistas en JDK 6.

Las principales clases e interfaces en java.lang son:

  • Object – la clase que es la raíz de cada jerarquía de clases.
  • Enum – la clase base para las clases de enumeración (como J2SE 5.0).
  • Class – la clase que es la raíz del sistema de reflexión 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 hilos.
  • String – la clase para cuerdas y literales de cuerda.
  • StringBuffer y StringBuilder – clases para realizar la manipulación de cadenas (StringBuilder a J2SE 5.0).
  • Comparable – la interfaz que permite la comparación y el orden genérico de objetos (como J2SE 1.2).
  • Iterable – la interfaz que permite la iteración genérica utilizando el bucle mejorado (como 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 ambientales de acogida como el tiempo del día, y la aplicación de políticas de seguridad.
  • Math y StrictMath – clases que proporcionan funciones básicas de matemáticas como el seno, cosina y raíz cuadradaStrictMath a J2SE 1.3).
  • Las clases primitivas de envoltura que encapsulan los tipos primitivos como objetos.
  • Las clases básicas de excepción lanzadas para el nivel de idiomas y otras excepciones comunes.

Las clases en java.lang se importan automáticamente a cada archivo fuente.

Java.lang.ref

El paquete java.lang.ref proporciona tipos de referencias más flexibles que los disponibles de otro modo, lo que permite una interacción limitada entre la aplicación y el recolector de elementos no utilizados de Java Virtual Machine (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 usan 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 paquete java.lang.ref define otros tres tipos de referencias: referencias blandas, débiles y fantasma. Cada tipo de referencia está diseñado para un uso específico.

  • A SoftReference se puede utilizar para implementar un caché. Un objeto que no es alcanzable por una referencia fuerte (es decir, no fuertemente alcanzable), pero que se refiere por una referencia suave se llama "softly accesible". Un objeto suavemente accesible puede ser la basura recogida a discreción del recolector de basura. Esto generalmente significa que los objetos suavemente accesibles son sólo basura recolectada cuando la memoria libre es baja, pero de nuevo, esto es a discreción del coleccionista de basura. Semánticamente, una referencia suave significa, "Mantenga este objeto cuando nada más lo refiera, a menos que la memoria sea necesaria."
  • A WeakReference se utiliza para implementar mapas débiles. Un objeto que no es fuertemente o suavemente accesible, pero que se refiere por una referencia débil se llama "deberamente accesible". Un objeto débilmente accesible es la basura recogida en el próximo ciclo de recogida. Este comportamiento se utiliza en la clase java.util.WeakHashMap. Un mapa débil permite que el programador ponga pares clave/valor en el mapa y no se preocupe por los objetos tomando memoria cuando la clave ya no es accesible en ningún otro lugar. Otra posible aplicación de referencias débiles es el grupo de pasantes de cadena. Semánticamente, una referencia débil significa "deshacerse de este objeto cuando nada más lo referencia en la próxima colección de basura".
  • A PhantomReference se utiliza para los objetos de referencia que han sido marcados para la recolección de basura y han sido finalizados, pero aún no han sido reclamados. Un objeto que no es fuertemente, suave o débilmente alcanzable, pero se refiere por una referencia fantasma se llama "fármamo alcanzable". Esto permite una limpieza más flexible de lo posible con el mecanismo de finalización solo. Semánticamente, una referencia fantasma significa "este objeto ya no es necesario y ha sido finalizado en preparación para ser recogido".

Cada uno de estos tipos de referencia amplía la clase Reference, que proporciona el método get() para devolver una referencia sólida al objeto de referencia (o null< /code> si la referencia se ha borrado o si el tipo de referencia es fantasma), y el método clear() para borrar la referencia.

El java.lang.ref también define la clase ReferenceQueue, que se puede usar en cada una de las aplicaciones discutidas anteriormente para realizar un seguimiento de los objetos que han cambiado el tipo de referencia.. Cuando se crea una Reference, se registra opcionalmente con una cola de referencia. La aplicación sondea la cola de referencia para obtener referencias que han cambiado el estado de accesibilidad.

Java.lang.reflect

Reflection es un componente de la API de Java que permite que el código de Java examine y "refleje" en componentes de Java en tiempo de ejecución y use los miembros reflejados. Las clases del paquete java.lang.reflect, junto con java.lang.Class y java.lang.Package admiten aplicaciones como depuradores, intérpretes, inspectores de objetos, navegadores de clases y servicios como la 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, las interfaces, los métodos, los campos y los constructores se pueden descubrir y utilizar en tiempo de ejecución. La reflexión es compatible con los metadatos que la JVM tiene sobre el programa.

Técnicas

Hay técnicas básicas involucradas en la reflexión:

  • Discovery – esto implica tomar un objeto o clase y descubrir los miembros, superclases, interfaces implementadas, y luego posiblemente utilizar los elementos descubiertos.
  • El uso por nombre implica comenzar con el nombre simbólico de un elemento y utilizar el elemento llamado.
Descubrimiento

El descubrimiento generalmente comienza con un objeto y llama al método Object.getClass() para obtener la Class del objeto. El objeto Class tiene varios métodos para descubrir el contenido de la clase, por ejemplo:

  • getMethods() – devuelve un array de Method objetos que representan todos los métodos públicos de la clase o la interfaz
  • getConstructors() – devuelve un array de Constructor objetos que representan a todos los constructores públicos de la clase
  • getFields() – devuelve un array de Field objetos que representan todos los campos públicos de la clase o la interfaz
  • getClasses() – devuelve un array de Class objetos que representan todas las clases públicas e interfaces que son miembros (por ejemplo, clases internas) de la clase o la interfaz
  • getSuperclass() – devuelve los Class objeto que representa la superclase de la clase o la interfaz (null es devuelto para interfaces)
  • getInterfaces() – devuelve un array de Class objetos que representan todas las interfaces que son implementadas por la clase o la interfaz
Usar por nombre

El objeto Class se puede obtener a través del descubrimiento, usando el class literal (por ejemplo, MyClass.class) o usando el nombre de la clase (por ejemplo, Class.forName("mypackage.MyClass")). Con un objeto Class, los objetos miembro Method, Constructor o Field se pueden obtener usando el nombre simbólico del miembro. Por ejemplo:

  • getMethod("methodName", Class...) – devuelve los 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 el Class... parámetros.
  • getConstructor(Class...) – devuelve los Constructor objeto que representa al constructor público de la clase que acepta los parámetros especificados por el Class... parámetros.
  • getField("fieldName") – devuelve los Field objeto que representa el campo público con el nombre "fieldName" de la clase o la interfaz.
Los objetos

Method, Constructor y Field se pueden usar para acceder dinámicamente al miembro representado de la clase. Por ejemplo:

  • Field.get(Object) – devuelve un Object que contiene el valor del campo desde la instancia del objeto pasado a get(). (Si Field el objeto representa un campo estático entonces el Object el parámetro es ignorado y puede ser null.)
  • Method.invoke(Object, Object...) – devuelve un Object que contiene el resultado de invocar el método para la instancia del primero Object Parámetro pasado invoke(). El resto Object... los parámetros se pasan al método. (Si Method el objeto representa un método estático entonces el primero Object el parámetro es ignorado y puede ser null.)
  • Constructor.newInstance(Object...) – devuelve el nuevo Object de invocar al constructor. El Object... los parámetros se pasan al constructor. (Nota que el constructor sin parámetro para una clase también puede ser invocado llamando newInstance().)
Matrices y proxies

El paquete java.lang.reflect también proporciona una clase Array que contiene métodos estáticos para crear y manipular objetos de matriz y, desde J2SE 1.3, un Proxy clase que admite la creación dinámica de clases de proxy que implementan interfaces específicas.

La implementación de una clase Proxy la proporciona un objeto suministrado que implementa la interfaz InvocationHandler. 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 objeto Method que representa el método de la interfaz implementado por el proxy, y el tercer parámetro es la matriz de parámetros pasados al método de interfaz. El método invoke() devuelve un resultado de Object que contiene el resultado devuelto al código que llamó al método de interfaz de proxy.

Java.io

El paquete java.io 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 InputStream y OutputStream, que son clases base abstractas para leer y escribir flujos de bytes, respectivamente. Las clases relacionadas Reader y Writer son clases base abstractas para leer y escribir flujos de caracteres, respectivamente. El paquete también tiene algunas clases misceláneas para admitir interacciones con el sistema de archivos del host.

Transmisiones

Las clases de flujo siguen el patrón del decorador al extender la subclase base para agregar funciones a las clases de flujo. Las subclases de las clases de flujo base generalmente se nombran por uno de los siguientes atributos:

  • la fuente/destinación de los datos de flujo
  • el tipo de datos escritos para / leer desde el flujo
  • procesamiento adicional o filtrado realizado en los datos de flujo

Las subclases de flujo se nombran usando el patrón de nomenclatura XxxStreamType donde Xxx es el nombre que describe la función y StreamType es uno de InputStream, OutputStream, Reader o Writer .

La siguiente tabla muestra las fuentes/destinos admitidos directamente por el paquete java.io:

Fuente/DestinaciónNombreTipos de transmisiónIn/OutClases
byte arraybyte[])ByteArraybytedentro, fuera ByteArrayInputStream, ByteArrayOutputStream
char arraychar[])CharArraychardentro, fuera CharArrayReader, CharArrayWriter
archivoFilebyte, chardentro, fuera FileInputStream, FileOutputStream, FileReader, FileWriter
cadenaStringBuffer)Stringchardentro, fuera StringReader, StringWriter
hiloThread)Pipedbyte, chardentro, fuera PipedInputStream, PipedOutputStream, PipedReader, PipedWriter

Otros paquetes de biblioteca estándar proporcionan implementaciones de flujo para otros destinos, como InputStream devuelto por el método java.net.Socket.getInputStream() o Java EE < código>javax.servlet.ServletOutputStream clase.

La gestión y el procesamiento de tipos de datos o el 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 funciones adicionales. Los filtros se crean ampliando una de las clases de filtro base FilterInputStream, FilterOutputStream, FilterReader o FilterWriter.

Las clases Reader y Writer son realmente flujos de bytes con un 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 Charset devuelto por el método estático java.nio.charset.Charset.defaultCharset(). La clase InputStreamReader convierte un InputStream en un Reader y la clase OutputStreamWriter convierte un OutputStream a un Escritor. Ambas clases tienen constructores que admiten la especificación de la codificación de caracteres que se usará. 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 paquete java.io admite directamente. Todas estas clases amplían la clase Filter correspondiente.

OperaciónNombreTipos de transmisiónIn/OutClases
bufferingBufferedbyte, chardentro, fuera BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
"push back" último valor leídoPushbackbyte, chardentro PushbackInputStream, PushbackReader
leer y escribir tipos primitivosDatabytedentro, fuera DataInputStream, DataOutputStream
objeto serialization (read/write objects)Objectbytedentro, fuera ObjectInputStream, ObjectOutputStream

Acceso aleatorio

La clase RandomAccessFile admite acceso aleatorio para leer y escribir archivos. La clase usa un puntero de archivo que representa un desplazamiento de bytes dentro del archivo para la próxima operación de lectura o escritura. El puntero del archivo se mueve implícitamente leyendo o escribiendo y explícitamente llamando a los métodos seek(long) o skipBytes(int). La posición actual del puntero del archivo es devuelta por el método getFilePointer().

Sistema de archivos

La clase File representa una ruta de archivo o directorio en un sistema de archivos. Los objetos File 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 File que representan directorios se pueden usar para obtener una lista de todos los archivos y directorios contenidos.

La clase FileDescriptor es un descriptor de archivo que representa una fuente o sumidero (destino) de bytes. Por lo general, se trata de un archivo, pero también puede ser una consola o un socket de red. Los objetos FileDescriptor se utilizan para crear transmisiones File. Se obtienen de File streams y java.net sockets y sockets de datagramas.

Java.nio

En J2SE 1.4, se agregó el paquete java.nio (NIO o E/S sin bloqueo) para admitir E/S mapeadas en memoria, lo que facilita las operaciones de E/S más cerca del hardware subyacente. con un rendimiento a veces dramáticamente mejor. El paquete java.nio proporciona soporte para varios tipos de búfer. El subpaquete java.nio.charset brinda soporte para diferentes codificaciones de caracteres para datos de caracteres. El subpaquete java.nio.channels brinda soporte para channels, que representan conexiones a entidades que son capaces de realizar operaciones de E/S, como archivos y sockets. El paquete java.nio.channels también brinda soporte para el bloqueo detallado de archivos.

Java.matemáticas

El paquete java.math admite aritmética 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 principales clases del paquete son:

  • BigDecimal – proporciona números decimales firmados con una precisión arbitraria. BigDecimal da el control del usuario sobre el comportamiento de redondeo a través RoundingMode.
  • BigInteger – proporciona enteros de precisión arbitraria. Operaciones sobre BigInteger no desborde o pierda la precisión. Además de las operaciones aritméticas estándar, proporciona aritmética modular, cálculo GCD, pruebas de primalidad, generación de números primos, manipulación de bits y otras operaciones diversas.
  • MathContext – encapsular los ajustes de contexto que describen ciertas reglas para operadores numéricos.
  • RoundingMode – una enumeración que proporciona ocho comportamientos de redondeo.

Java.net

El paquete java.net proporciona rutinas de E/S especiales para redes, lo que permite solicitudes HTTP, así como otras transacciones comunes.

Java.texto

El paquete java.text implementa rutinas de análisis para cadenas y es compatible con varios idiomas legibles por humanos y análisis específicos de la configuración regional.

Java.util

Las estructuras de datos que agregan objetos son el foco del paquete java.util. El paquete incluye la API de colecciones, una jerarquía de estructura de datos organizada influenciada en gran medida por las consideraciones de los patrones de diseño.

Paquetes para propósitos especiales

Applet Java

Creado para admitir la creación de subprogramas de Java, el paquete java.applet permite que las aplicaciones se descarguen a través de una red y se ejecuten dentro de un espacio aislado protegido. Las restricciones de seguridad se imponen fácilmente en el sandbox. Un desarrollador, por ejemplo, puede aplicar una firma digital a un subprograma, etiquetándolo así como seguro. Hacerlo le 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 de certificación.

Java.beans

Incluido en el paquete java.beans hay 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.

Java.awt

El java.awt, o Abstract Window Toolkit, brinda 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 los sistemas compatibles. Este paquete, junto con javax.swing contiene la mayor cantidad de enumeraciones (7 en total) en JDK 6.

Java.rmi

El paquete java.rmi proporciona la invocación de métodos remotos de Java para admitir llamadas de procedimientos remotos entre dos aplicaciones Java que se ejecutan en diferentes JVM.

Java.seguridad

La compatibilidad con la seguridad, incluido el algoritmo de resumen de mensajes, se incluye en el paquete java.security.

Java.sql

Una implementación de la API de JDBC (utilizada para acceder a bases de datos SQL) se agrupa en el paquete java.sql.

Javax.rmi

El paquete javax.rmi proporcionó soporte para la comunicación remota entre aplicaciones, utilizando el protocolo RMI sobre IIOP. Este protocolo combina características RMI y CORBA.

Tecnologías centrales de Java SE - CORBA / RMI-IIOP

Javax.swing

Swing es una colección de rutinas que se basan en java.awt para 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 de la compatibilidad con 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 apariencia conectable (PLAF) para que los widgets en la GUI puedan 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 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, los "diseños" se utilizan y mantienen los elementos dentro de una GUI estéticamente coherente en todas las plataformas.

Javax.swing.text.html.parser

El paquete javax.swing.text.html.parser proporciona el analizador HTML tolerante a errores que se utiliza para escribir varios navegadores web y bots web.

Javax.xml.bind.anotación

El paquete javax.xml.bind.annotation contenía 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.

Paquetes Dios mío

Org.omg.CORBA

El paquete org.omg.CORBA brindó soporte para la comunicación remota entre aplicaciones usando el Protocolo General Inter-ORB y es compatible con otras características de la arquitectura de intermediario de solicitudes de objetos comunes. Al igual que RMI y RMI-IIOP, este paquete es para llamar a métodos remotos de objetos en otras máquinas virtuales (generalmente a través de la red).

Este paquete contenía la mayor cantidad de clases Exception (45 en total) en JDK 6. De todas las posibilidades de comunicación, CORBA es portátil entre varios idiomas; sin embargo, con esto viene más complejidad.

Estos paquetes quedaron obsoletos en Java 9 y se eliminaron de Java 11.

Org.omg.Interceptor portátil

El paquete org.omg.PortableInterceptor contenía la mayor cantidad de interfaces (39 en total) en JDK 6. Proporciona un mecanismo para registrar enlaces ORB a través de los cuales los servicios ORB interceptan el flujo normal de ejecución. del ORBE.

Seguridad

Se han informado varias vulnerabilidades de seguridad críticas. Las alertas de seguridad de Oracle anuncian parches críticos relacionados con la seguridad para Java SE.

Contenido relacionado

Cronología de la informática 1950-1979

Representación de línea de exploración

UsarModWiki

Más resultados...
Tamaño del texto: