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 un código de bytes 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 de 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 separado. Por lo tanto, se denomina archivo .class porque contiene el código de bytes 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]

Diseño y estructura de archivos

Secciones

Hay 10 secciones básicas en la estructura de archivos de clases Java:

Número mágico

Los archivos de clase se identifican mediante el siguiente encabezado de 4 bytes (en hexadecimal ): (las primeras 4 entradas en la siguiente tabla). 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 el oscuro pasado, los Grateful Dead solían actuar allí antes de triunfar. Era un lugar bastante original que definitivamente era un Grateful Dead Kinda Place. Cuando Jerry murió, incluso levantaron un pequeño santuario de estilo budista. Cuando solíamos ir allí, nos referíamos al lugar como Café Dead. En algún momento nos dimos cuenta de que se trataba de un número HEX. Estaba renovando algún 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 para buscar palabras hexadecimales de 4 caracteres que encajaran después de "CAFE". " (parecía ser un buen tema) Se me ocurrió BABE y decidí usarlo. En ese momento, no parecía muy importante ni destinado a ir a ninguna parte más que al basurero de la historia. Así que CAFEBABE se convirtió en el archivo de la clase. formato, y CAFEDEAD era el formato de objeto persistente, pero la función de objeto persistente desapareció, y junto con ella desapareció el uso de CAFEDEAD; finalmente fue reemplazado por RMI .

Disposición general

Debido a que el archivo de clase contiene elementos de tamaño variable y no contiene también desplazamientos (o punteros) de archivos incrustados, generalmente se analiza secuencialmente, desde el primer byte hacia 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 luego se reinterpretan como valores de nivel superior (como cadenas o números de punto flotante), según el contexto. No se exige la 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 siguiente no se compilará y solo sirve como demostración.

struct Class_File_Format { u4 número_mágico ;     u2 versión_menor ; u2 versión_mayor ;     u2 recuento_grupo_constante ; cp_info grupo_constante [ cuenta_grupo_constante - 1 ];        u2 banderas_acceso ;  u2 esta_clase ; u2 super_clase ;    u2 interfaces_count ; interfaces u2 [ interfaces_count ];      u2 recuento_campos ; campos_info_campo [ recuento_campos ] ;     u2 métodos_count ; métodos método_info [ métodos_recuento ];    u2 atributos_count ; atributos_info_atributos [ recuento_atributos ] ; }    

La piscina constante

La tabla de grupo de 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 grupo de constantes vienen dados por números de 16 bits (tipo u2), donde el valor de índice 1 se refiere 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, el número de constantes en la tabla del grupo de constantes no es en realidad el mismo que el recuento del grupo de constantes que precede a la tabla. Primero, la tabla está indexada comenzando en 1 (en lugar de 0), pero el recuento debería interpretarse como el índice máximo más uno. [6] Además, dos tipos de constantes (largas y dobles) ocupan dos espacios consecutivos en la tabla, aunque el segundo espacio 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 . El número 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:

Sólo hay dos tipos de constantes integrales, enteras y largas. 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, tradicionalmente están separados por puntos, como "java.lang.Object". Sin embargo, dentro de las constantes de referencia de clase de bajo nivel, aparece un formulario interno 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 una discusión completa). La primera es que el punto de código U+0000 está codificado como una 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 usando una construcción de par sustituto similar a UTF-16 en lugar de codificarse directamente usando UTF-8. En este caso, cada uno de los dos sustitutos está codificado por separado en UTF-8. Por ejemplo, U+1D11E está codificado como la secuencia de 6 bytes ED A0 B4 ED B4 9E, en lugar de la codificación UTF-8 de 4 bytes correcta de F0 9D 84 9E.

Ver 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 de JDK 10".
  5. ^ "[JDK-8148785] Actualice la versión del archivo de clase a 53 para JDK-9 - Java Bug System".
  6. ^ abcdefg "Capítulo 4. El formato de archivo de clase".

Otras lecturas