stringtranslate.com

Archivo de clase Java

Un archivo de clase Java es un archivo (con la extensión de nombre de archivo .class ) que contiene bytecode de Java que se puede ejecutar en la máquina virtual Java (JVM) . Un archivo de clase Java generalmente lo produce un compilador de Java a partir de archivos fuente del lenguaje de programación Java ( archivos .java ) que contienen clases Java (como alternativa, también se pueden usar otros lenguajes JVM para crear archivos de clase). Si un archivo fuente tiene más de una clase, cada clase se compila en un archivo de clase independiente. Por lo tanto, se denomina archivo .class porque contiene el bytecode de una sola clase.

Las JVM están disponibles para muchas plataformas y un archivo de clase compilado en una plataforma se ejecutará en una JVM de otra plataforma. Esto hace que las aplicaciones Java sean independientes de la plataforma .

Historia

El 11 de diciembre de 2006, el formato del archivo de clase se modificó según la Solicitud de especificación de Java (JSR) 202. [1]

Disposición y estructura de los archivos

Secciones

Hay 10 secciones básicas en la estructura del archivo de clase Java:

Número mágico

Los archivos de clase se identifican mediante el siguiente encabezado de 4 bytes (en hexadecimal ): (las primeras 4 entradas de la tabla siguiente). La historia de este número mágico fue explicada por James Gosling refiriéndose a un restaurante en Palo Alto : [2]CA FE BA BE

"Solíamos ir a almorzar a un lugar llamado St Michael's Alley. Según la leyenda local, en un pasado muy oscuro, los Grateful Dead solían actuar allí antes de que se hicieran famosos. Era un lugar bastante peculiar que definitivamente era un lugar al estilo de los Grateful Dead. Cuando Jerry murió, incluso levantaron un pequeño santuario de estilo budista. Cuando solíamos ir allí, nos referíamos al lugar como Cafe Dead. En algún momento se notó que se trataba de un número HEX. Estaba renovando un código de formato de archivo y necesitaba un par de números mágicos : uno para el archivo de objeto persistente y otro para las clases. Usé CAFEDEAD para el formato de archivo de objeto y, al buscar palabras hexadecimales de 4 caracteres que encajaran después de "CAFE" (parecía ser un buen tema), encontré BABE y decidí usarlo. En ese momento, no parecía terriblemente importante ni destinado a ir a ningún lado más que al basurero de la historia. Entonces CAFEBABE se convirtió en el formato de archivo de clase y CAFEDEAD en el formato de objeto persistente. Pero la función de objetos persistentes desapareció, y junto con ella desapareció el uso de CAFEDEAD: finalmente fue reemplazado por RMI ".

Disposición general

Dado que el archivo de clase contiene elementos de tamaño variable y no contiene desplazamientos de archivo (o punteros) incorporados, normalmente se analiza de forma secuencial, desde el primer byte hasta el final. En el nivel más bajo, el formato de archivo se describe en términos de algunos tipos de datos fundamentales:

Algunos de estos tipos fundamentales se reinterpretan luego como valores de nivel superior (como cadenas o números de punto flotante), según el contexto. No se aplica ninguna alineación de palabras, por lo que nunca se utilizan bytes de relleno. El diseño general del archivo de clase se muestra en la siguiente tabla.

Representación en un lenguaje de programación tipo C

Dado que C no admite múltiples matrices de longitud variable dentro de una estructura, el código a continuación no se compilará y solo sirve como demostración.

estructura Formato_Archivo_Clase { u4 numero_mágico ;     u2 versión_menor ; u2 versión_mayor ;     u2 recuento_de_grupo_constante ; cp_info recuento_de_grupo_constante [ recuento_de_grupo_constante - 1 ];        u2 banderas de acceso ;  u2 esta_clase ; u2 super_clase ;    u2 interfaces_count ; u2 interfaces [ interfaces_count ];      u2 campos_count ; información_campo campos [ campos_count ];     u2 métodos_conteo ; información_método métodos [ métodos_conteo ];    u2 atributos_conteo ; información_del_atributo atributos [ atributos_conteo ]; }    

La piscina constante

La tabla de valores constantes es donde se almacenan la mayoría de los valores constantes literales. Esto incluye valores como números de todo tipo, cadenas, nombres de identificadores, referencias a clases y métodos y descriptores de tipos. Todos los índices o referencias a constantes específicas en la tabla de valores constantes se dan mediante números de 16 bits (tipo u2), donde el valor de índice 1 hace referencia a la primera constante de la tabla (el valor de índice 0 no es válido).

Debido a las elecciones históricas realizadas durante el desarrollo del formato de archivo, la cantidad de constantes en la tabla de grupo de constantes no es en realidad la misma que el recuento del grupo de constantes que precede a la tabla. En primer lugar, la tabla se indexa a partir de 1 (en lugar de 0), pero el recuento en realidad debería interpretarse como el índice máximo más uno. [6] Además, dos tipos de constantes (longs y doubles) ocupan dos ranuras consecutivas en la tabla, aunque la segunda ranura es un índice fantasma que nunca se utiliza directamente.

El tipo de cada elemento (constante) en el grupo de constantes se identifica mediante una etiqueta de byte inicial . La cantidad de bytes que siguen a esta etiqueta y su interpretación dependen del valor de la etiqueta. Los tipos de constantes válidos y sus valores de etiqueta son:

Solo hay dos tipos de constantes integrales: entero y largo. Otros tipos integrales que aparecen en el lenguaje de alto nivel, como booleano, byte y corto, deben representarse como una constante entera.

Los nombres de clase en Java, cuando están completamente calificados, se separan tradicionalmente con puntos, como "java.lang.Object". Sin embargo, dentro de las constantes de referencia de clase de bajo nivel, aparece una forma interna que utiliza barras diagonales, como "java/lang/Object".

Las cadenas Unicode, a pesar del apodo "cadena UTF-8", en realidad no están codificadas según el estándar Unicode, aunque es similar. Hay dos diferencias (consulte UTF-8 para obtener una explicación completa). La primera es que el punto de código U+0000 está codificado como la secuencia de dos bytes C0 80(en hexadecimal) en lugar de la codificación estándar de un solo byte 00. La segunda diferencia es que los caracteres suplementarios (aquellos fuera del BMP en U+10000 y superiores) se codifican utilizando una construcción de par sustituto similar a UTF-16 en lugar de codificarse directamente utilizando UTF-8. En este caso, cada uno de los dos sustitutos se codifica por separado en UTF-8. Por ejemplo, U+1D11E se codifica como la secuencia de 6 bytes ED A0 B4 ED B4 9E, en lugar de la codificación UTF-8 correcta de 4 bytes de F0 9D 84 9E.

Véase también

Referencias

  1. ^ Actualización de la especificación del archivo de clase Java JSR 202
  2. ^ Comunicación privada de James Gosling a Bill Bumgarner
  3. ^ "Capítulo 4. El formato de archivo de clase".
  4. ^ "Notas de la versión JDK 10".
  5. ^ "[JDK-8148785] Actualizar la versión del archivo de clase a 53 para JDK-9 - Sistema de errores de Java".
  6. ^ abcdefg "Capítulo 4. El formato de archivo de clase".

Lectura adicional