Estructura de archivos de clase JVM y carga de clases

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_versionson 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_FINALACC_SUPERACC_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_countCONSTANT_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_ABSTRACTse 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 .

Supongo que te gusta

Origin blog.csdn.net/lewee0215/article/details/110358234
Recomendado
Clasificación