El sitio web oficial de Oracle define el archivo de clase: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
La ClassFile
estructura
Un class
archivo consta de una única ClassFile
estructura:
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
Los elementos de la ClassFile
estructura son los siguientes:
magia
El magic
artículo proporciona el número mágico que identifica el class
formato de archivo; tiene el valor 0xCAFEBABE
Los primeros 4 bytes de cada archivo de clase se denominan Número mágico y su única función es determinar si la máquina virtual puede aceptar el archivo.
Muchos estándares de almacenamiento de archivos utilizan números mágicos para la identificación, como imágenes gif y jpeg, que almacenan números mágicos en el encabezado del archivo. El uso de números mágicos en lugar de extensiones para la identificación se basa principalmente en consideraciones de seguridad, porque las extensiones se pueden cambiar cambiando el nombre y otros métodos a voluntad.
minor_version, major_version
Los valores de los elementos minor_version
y major_version
son los números de versión menor y mayor de este class
archivo. Juntos, un número de versión principal y uno secundario determinan la versión del class
formato de archivo. Si un class
archivo tiene el número de versión principal M y el número de versión secundaria m, denotamos la versión de su class
formato de archivo como Mm. Por lo tanto, las class
versiones de formato de archivo pueden ordenarse lexicográficamente, por ejemplo, 1.5 <2.0 <2.1.
Una implementación de Java Virtual Machine puede admitir un class
formato de archivo de la versión v si y solo si v se encuentra en algún rango contiguo Mi.0 ≤ v ≤ Mj.m. El nivel de lanzamiento de la plataforma Java SE al que se ajusta la implementación de una máquina virtual Java es responsable de determinar el rango.
La implementación de Java Virtual Machine de Oracle en la versión 1.0.2 de JDK admite las class
versiones de formato de archivo 45.0 a 45.3 inclusive. Las versiones 1.1 de JDK. * class
Admiten versiones de formato de archivo en el rango de 45.0 a 45.65535 inclusive. Para k ≥ 2, la versión 1.k de JDK admite class
versiones de formato de archivo en el rango de 45.0 a 44 + k.0 inclusive.
cuenta_constante_constante
El valor del constant_pool_count
artículo es igual al número de entradas en la constant_pool
tabla más uno. Un constant_pool
índice se considera válido si es mayor que cero y menor que constant_pool_count
, con la excepción de las constantes de tipo long
y se double
indica en §4.4.5 .
grupo_constante []
La constant_pool
es una tabla de las estructuras ( §4.4 ) que representa varias constantes de cadena, nombres de clases y de interfaz, nombres de campo, y otras constantes que se hace referencia dentro de la ClassFile
estructura y de sus subestructuras. El formato de cada constant_pool
entrada de la tabla se indica mediante su primer byte de "etiqueta".
La constant_pool
tabla está indexada de 1 a constant_pool_count
- 1.
access_flags
El valor del access_flags
elemento es una máscara de banderas que se utiliza para indicar los permisos de acceso y las propiedades de esta clase o interfaz. La interpretación de cada bandera, cuando se establece, se especifica en la Tabla 4.1-A .
Tabla 4.1-A. Modificadores de propiedad y acceso a clases
Nombre de la bandera | Valor | Interpretación |
---|---|---|
ACC_PUBLIC |
0x0001 | Declarado public ; se puede acceder desde fuera de su paquete. |
ACC_FINAL |
0x0010 | Declarado final ; no se permiten subclases. |
ACC_SUPER |
0x0020 | Tratar a los métodos de superclase especialmente cuando se invoca por el invokespecial de instrucciones. |
ACC_INTERFACE |
0x0200 | Es una interfaz, no una clase. |
ACC_ABSTRACT |
0x0400 | Declarado abstract ; no debe ser instanciado. |
ACC_SYNTHETIC |
0x1000 | Sintético declarado; no presente en el código fuente. |
ACC_ANNOTATION |
0x2000 | Declarado como un tipo de anotación. |
ACC_ENUM |
0x4000 | Declarado como un enum tipo. |
Una interfaz se distingue por la ACC_INTERFACE
bandera que se establece. Si la ACC_INTERFACE
bandera no está establecida, este class
archivo define una clase, no una interfaz.
Si el ACC_INTERFACE
indicador está activado, el ACC_ABSTRACT
indicador también se debe configurar, y el ACC_FINAL
, ACC_SUPER
y ACC_ENUM
banderas conjunto no debe ser conjunto.
Si ACC_INTERFACE
no se establece la bandera, cualquiera de las otras banderas de la Tabla 4.1-A se puede configurar excepto ACC_ANNOTATION
. Sin embargo, dicho class
archivo no debe tener configurados sus indicadores ACC_FINAL
y ACC_ABSTRACT
(JLS §8.1.1.2).
La ACC_SUPER
bandera indica cuál de las dos semánticas alternativas debe ser expresada por la instrucción invokeespecial ( § invokespecial ) si aparece en esta clase o interfaz. Los compiladores del conjunto de instrucciones de la máquina virtual Java deben establecer la ACC_SUPER
bandera. En Java SE 8 y superior, la máquina virtual de Java considera que la ACC_SUPER
bandera se establece en cada class
archivo, independientemente del valor real de la bandera en el class
archivo y la versión del class
archivo.
La ACC_SUPER
bandera existe para compatibilidad con versiones anteriores del código compilado por compiladores más antiguos para el lenguaje de programación Java. En las versiones de JDK anteriores a 1.0.2, el compilador generaba access_flags
en el que la bandera que ahora representa ACC_SUPER
no tenía un significado asignado, y la implementación de Java Virtual Machine de Oracle ignoraba la bandera si estaba configurada.
La ACC_SYNTHETIC
bandera indica que esta clase o interfaz fue generada por un compilador y no aparece en el código fuente.
Un tipo de anotación debe tener su ACC_ANNOTATION
marca establecida. Si la ACC_ANNOTATION
bandera está configurada, la ACC_INTERFACE
bandera también debe estar configurada.
La ACC_ENUM
bandera indica que esta clase o su superclase se declara como un tipo enumerado.
Todos los bits del access_flags
elemento no asignado en la Tabla 4.1-A están reservados para uso futuro. Deben establecerse en cero en los class
archivos generados y las implementaciones de máquinas virtuales Java deben ignorarlos.
esta clase
El valor del this_class
artículo debe ser un índice válido en la constant_pool
tabla. La constant_pool
entrada en ese índice debe ser una CONSTANT_Class_info
estructura ( §4.4.1 ) que represente la clase o interfaz definida por este class
archivo.
super_clase
Para una clase, el valor del super_class
elemento debe ser cero o debe ser un índice válido en la constant_pool
tabla. Si el valor del super_class
elemento es distinto de cero, la constant_pool
entrada en ese índice debe ser una CONSTANT_Class_info
estructura que represente la superclase directa de la clase definida por este class
archivo. Ni la superclase directa ni ninguna de sus superclases pueden tener la ACC_FINAL
bandera establecida en el access_flags
elemento de su ClassFile
estructura.
Si el valor del super_class
elemento es cero, entonces este class
archivo debe representar la clase Object
, la única clase o interfaz sin una superclase directa.
Para una interfaz, el valor del super_class
elemento siempre debe ser un índice válido en la constant_pool
tabla. La constant_pool
entrada en ese índice debe ser una CONSTANT_Class_info
estructura que represente la clase Object
.
interfaces_count
El valor del interfaces_count
elemento da el número de superinterfaces directas de esta clase o tipo de interfaz.
interfaces []
Cada valor de la interfaces
matriz debe ser un índice válido en la constant_pool
tabla. La constant_pool
entrada en cada valor de , donde 0 ≤ i < , debe ser una estructura que represente una interfaz que sea una superinterfaz directa de esta clase o tipo de interfaz, en el orden de izquierda a derecha que se indica en el origen del tipo.interfaces[i]
interfaces_count
CONSTANT_Class_info
fields_count
El valor del fields_count
artículo da el número de field_info
estructuras en la fields
tabla. Las field_info
estructuras representan todos los campos, tanto variables de clase como de instancia, declaradas por esta clase o tipo de interfaz.
campos[]
Cada valor de la fields
tabla debe ser una field_info
estructura ( §4.5 ) que proporcione una descripción completa de un campo en esta clase o interfaz. La fields
tabla incluye solo los campos declarados por esta clase o interfaz. No incluye elementos que representan campos que se heredan de superclases o superinterfaces.
cuenta_métodos
El valor del methods_count
artículo da el número de method_info
estructuras en la methods
tabla.
métodos[]
Cada valor de la methods
tabla debe ser una method_info
estructura ( §4.6 ) que proporcione una descripción completa de un método en esta clase o interfaz. Si ninguno de los indicadores ACC_NATIVE
y ACC_ABSTRACT
se establecen en el access_flags
elemento de una method_info
estructura, también se proporcionan las instrucciones de la máquina virtual Java que implementan el método.
Las method_info
estructuras representan todos los métodos declarados por esta clase o tipo de interfaz, incluidos los métodos de instancia, los métodos de clase, los métodos de inicialización de instancia ( §2.9 ) y cualquier método de inicialización de clase o interfaz ( §2.9 ). La methods
tabla no incluye elementos que representen métodos heredados de superclases o superinterfaces.
cuenta_atributos
El valor del attributes_count
artículo da el número de atributos en la attributes
tabla de esta clase.
atributos []
Cada valor de la attributes
tabla debe ser una attribute_info
estructura ( §4.7 ).
Los atributos definidos por esta especificación que aparecen en la attributes
tabla de una ClassFile
estructura se enumeran en la Tabla 4.7-C .
Las reglas relativas a los atributos definidos para aparecer en la attributes
tabla de una ClassFile
estructura se dan en §4.7 .
Las reglas relativas a atributos no predefinidos en la attributes
tabla de una ClassFile
estructura se dan en §4.7.1 .