Articulo de referencia

archivo de clase Java

Un archivo de clase Java es un archivo (con la extensión .class ) que contiene código de bytes Java ejecutable en la Máquina Virtual Java (JVM) . Generalmente, un compilador Jav...

Un archivo de clase Java es un archivo (con la extensión .class ) que contiene código de bytes Java ejecutable en la Máquina Virtual Java (JVM) . Generalmente, un compilador Java genera un archivo de clase Java a partir de archivos fuente del lenguaje de programación Java ( .java ) que contienen clases Java (aunque también se pueden usar otros lenguajes de la JVM para crear archivos de clase). Si un archivo fuente contiene más de una clase, cada una se compila en un archivo de clase independiente. Por lo tanto, se denomina archivo .class porque contiene el código de bytes de una sola clase.

Existen máquinas virtuales Java (JVM) 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 fue modificado bajo la Solicitud de Especificación de Java (JSR) 202. [ 1 ]

Diseño y estructura de los archivos

Secciones

La estructura de un archivo de clase Java consta de 10 secciones básicas:

  • Número mágico :0xCAFEBABE
  • Versión del formato del archivo de clase : las versiones menor y mayor del archivo de clase.
  • Constant Pool : Conjunto de constantes para la clase
  • Indicadores de acceso : por ejemplo, si la clase es abstracta, estática, etc.
  • Esta clase : El nombre de la clase actual
  • Súper Clase : El nombre de la súper clase
  • Interfaces : Cualquier interfaz en la clase
  • Campos : Cualquier campo de la clase
  • Métodos : Cualquier método de la clase
  • Atributos : Cualquier atributo de la clase (por ejemplo, el nombre del archivo fuente, etc.).

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 tabla a continuación). 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 remoto, los Grateful Dead solían tocar allí antes de hacerse famosos. Era un lugar bastante peculiar, sin duda un lugar típico de los Grateful Dead. Cuando Jerry murió, incluso erigieron un pequeño santuario de estilo budista. Cuando íbamos, lo llamábamos Café Muerto. En algún momento, nos dimos cuenta de que era un número hexadecimal. Estaba renovando el código de un 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 un buen tema) di con BABE y decidí usarlo. En ese momento, no parecía muy importante ni destinado a terminar en el olvido. Así que CAFEBABE se convirtió en el formato de archivo de clase, y CAFEDEAD en el formato de objeto persistente. Pero el persistente La funcionalidad de objetos desapareció, y con ella el uso de CAFEDEAD, que finalmente fue reemplazado por RMI .

Disposición general

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

  • u1 : un entero sin signo de 8 bits
  • u2 : un entero sin signo de 16 bits en orden de bytes big-endian
  • u4 : un entero sin signo de 32 bits en orden de bytes big-endian
  • tabla : una matriz de elementos de longitud variable de algún tipo. El número de elementos en la tabla se identifica mediante un número de conteo precedente (el conteo es un u2), pero el tamaño en bytes de la tabla solo se puede determinar examinando cada uno de sus elementos.

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

Representación de un archivo de clase

A continuación se muestra una representación de un archivo .class como si fuera una estructura de estilo C.

struct ClassFileFormat { u4 magicNumber ;u2 versión menor ; u2 versión mayor ;u2 constantPoolCount ; ConstantPoolInfo [ constantPoolCount - 1 ] constantPool ;u2 accessFlags ;u2 estaClase ; u2 superClase ;u2 interfacesCount ; u2 [ interfacesCount ] interfaces ;u2 fieldsCount ; FieldInfo [ fieldsCount ] fields ;u2 methodsCount ; MethodInfo [ methodsCount ] methods ;u2 attributesCount ; AttributeInfo [ attributesCount ] attributes ; }

El estanque constante

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

Debido a decisiones históricas tomadas durante el desarrollo del formato de archivo, el número de constantes en la tabla de grupos de constantes no es realmente el mismo que el recuento de grupos de constantes que precede a la tabla. Primero, la tabla está indexada comenzando en 1 (en lugar de 0), pero el recuento debe interpretarse como el índice máximo más uno. [ 6 ] Además, dos tipos de constantes (longs y doubles) ocupan dos espacios consecutivos en la tabla, aunque el segundo de estos espacios es un índice fantasma que nunca se utiliza directamente.

El tipo de cada elemento (constante) en el conjunto 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 misma. Los tipos de constantes válidos y sus valores de etiqueta son:

Solo existen dos tipos de constantes enteras: integer y long. Otros tipos enteros que aparecen en el lenguaje de alto nivel, como boolean, byte y short, deben representarse como una constante entera.

En Java, los nombres de clase, cuando están completamente calificados, se separan tradicionalmente con puntos, como por ejemplo "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 por ejemplo "java/lang/Object".

Las cadenas Unicode, a pesar de la denominación "cadena UTF-8", en realidad no están codificadas según el estándar Unicode, aunque es similar. Hay dos diferencias (véase UTF-8 para una explicación completa). La primera es que el punto de código U+0000 se codifica 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 utilizando una construcción de pares subrogados similar a UTF-16 en lugar de codificarse directamente utilizando UTF-8. En este caso, cada uno de los dos subrogados 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 F0 9D 84 9E.

Véase también

Referencias

  1. Actualización de la especificación de archivos de clase Java JSR 202
  2. Comunicación privada de James Gosling a Bill Bumgarner
  3. "Tabla 1.2-A. Versiones de Java SE y versiones principales de archivos de clase" .
  4. "Notas de la versión de JDK 10" .
  5. " [ JDK-8148785 ] Actualizar la versión del archivo de clase a 53 para JDK-9 - Java Bug System" .
  6. 1 2 3 4 5 6 7 "Capítulo 4. El formato de archivo de clase" .

Lecturas adicionales

  • Tim Lindholm , Frank Yellin (1999). Especificación de la máquina virtual Java (Segunda  edición). Prentice Hall. ISBN 0-201-43294-3. Consultado el 13 de octubre de 2008 .El documento oficial que define la Máquina Virtual de Java , que incluye el formato de archivo de clase. Tanto la primera como la segunda edición del libro están disponibles gratuitamente en línea para su consulta y/o descarga .