JVM X de serie (estructura de archivos de clase).

A, estructura de archivos de clase

número de versión JDK ha llegado a 14, el cambio con respecto a otros aspectos del lenguaje, la API y el sistema de la tecnología Java, la estructura de archivos de clases ha estado en un estado relativamente estable, el número de la estructura principal y la semántica de los archivos de clase instrucciones de código de bytes pequeños se han producido cambios.

archivo de clase es un conjunto de flujo binario de 8 bits en unidades de bytes basado en respectivos elementos de datos están dispuestos de forma compacta en el orden exacto en el archivo de clase, sin añadir ningún separadores intermedios, lo que hace que el contenido de todo el archivo se almacena en la clase casi todos datos necesarios para ejecutar el programa, no hay ningún hueco.

Bajo la estructura de formato de archivo de Java Virtual Machine Especificación, Clase de una estructura de lenguaje C-como seudo para almacenar datos, tales estructuras ficticias son sólo dos tipos de datos: tablas y sin firmar:

Sin signo: En u1, u2, u4, U8 a número sin signo que representa 1 byte, 2 bytes, 4 bytes y 8 bytes, número sin signo se puede utilizar para describir figuras, el índice de referencia , el número de valores o valor de cadena configurado según la codificación UTF-8.

Tabla: Número de símbolos a una pluralidad de no mesa o cualquier otro tipo de datos como un compuesto compuesto de elementos de datos, todas las tablas son habituales "_info" fin, se utiliza para describir una estructura de datos compuesta de la jerarquía es esencialmente el archivo completo es Clase una mesa.

El siguiente es un formato de archivo de clase:

tipo nombre cantidad descripción
U4 magia 1 Indica si el archivo puede ser aceptado como un archivo de clase máquina virtual
u2 minor_version 1 número de versión menor
u2 major_version 1 El número de versión principal, número de versión de Java desde 45 aperturas
u2 constant_pool_count 1 La piscina constante valor de cómputo de la capacidad
cp_info constant_pool constant_pool_count-1 La piscina constante es un almacén de recursos del archivo de clase, el principal de almacenamiento de dos categorías: las constantes referencias literales y simbólicos (ver definición más abajo)
u2 access_flags 1 Identificar la jerarquía de clases / interfaz de acceso a la información, tales como: Esta clase es una clase o una interfaz, si el pubilc, tales como si la final
u2 esta clase 1 índice de clase para determinar el nombre completo de la clase
u2 super_class 1 Índice de los padres para determinar el nombre completo de la clase padre de la clase
u2 interfaces_count 1 El número de interfaces implementadas en el conjunto de índices
u2 las interfaces interfaces_count Se utiliza para describir las interfaces esta clase implementa el cual
u2 fields_count 1 Número de campos
field_info campos fields_count Descripción interfaz o variables declaradas en la clase, incluyendo las variables de instancia de clase y variables clase Stage
u2 methods_count 1 Métodos cuantitativos
method_info métodos methods_count El método descrito interfaz o declarado en la clase, instancia, y método que comprende un método de escala de nivel de clase
u2 attributes_count 1 Número de Propiedades
attribute_info atributos attributes_count Descripción del campo / tabla de métodos información adicional, como el código para la memoria de código específica, para el almacenamiento de constantes y similares ConstantValue

Literal se refiere a las cadenas de texto lenguaje Java, declarados como un valor constante final y así sucesivamente. Las referencias simbólicas pertenecen al concepto de los aspectos de la teoría del compilador, incluyendo las tres constantes siguientes:

  • El nombre completo de la clase y la interfaz
  • Nombre de símbolo o campo Descripción
  • Nombre o descripción del identificador de método

código de bytes del archivo dos, Clase

public class TestClass {

    private int m;

    public int inc() {
        return m + 1;
    }
}

Nos TestClass.class archivo mediante la salida de contenido del parámetro -verbose herramienta JAVA_HOME / bin / javap para el análisis de código de bytes del archivo de clase.

javap -verbose TestClass
 Classfile /D:/JMCui/jvm-demo/demo/target/classes/org/jvm/demo/chapter6/TestClass.class
     Last modified 2020-4-1; size 397 bytes
     MD5 checksum 291f52e2b746bf6c338ece68fdf3dc08
     Compiled from "TestClass.java"
     public class org.jvm.demo.chapter6.TestClass
     minor version: 0
     major version: 52
     flags: ACC_PUBLIC, ACC_SUPER
     Constant                                                                          :
     #1 = Methodref          #4.#18         // java/lang/Object."<init>":()V
     #2 = Fieldref           #3.#19         // org/jvm/demo/chapter6/TestClass.m:I
     #3 = Class              #20            // org/jvm/demo/chapter6/TestClass
     #4 = Class              #21            // java/lang/Object
     #5 = Utf8               m
     #6 = Utf8               I
     #7 = Utf8               <init>
     #8 = Utf8               ()V
     #9 = Utf8               Code
     #10 = Utf8               LineNumberTable
     #11 = Utf8               LocalVariableTable
     #12 = Utf8               this
     #13 = Utf8               Lorg/jvm/demo/chapter6/TestClass;
     #14 = Utf8               inc
     #15 = Utf8               ()I
     #16 = Utf8               SourceFile
     #17 = Utf8               TestClass.java
     #18 = NameAndType        #7:#8          // "<init>":()V
     #19 = NameAndType        #5:#6          // m:I
     #20 = Utf8               org/jvm/demo/chapter6/TestClass
     #21 = Utf8               java/lang/Object
     {
     public org.jvm.demo.chapter6.TestClass();
     descriptor: ()V
     flags: ACC_PUBLIC
     Code:
     stack=1, locals=1, args_size=1
     0: aload_0
     1: invokespecial #1                  // Method java/lang/Object."<init>":()V
     4: return
     LineNumberTable:
     line 7: 0
     LocalVariableTable:
     Start  Length  Slot  Name   Signature
     0       5     0  this   Lorg/jvm/demo/chapter6/TestClass;

     public int inc();
     descriptor: ()I
     flags: ACC_PUBLIC
     Code:
     stack=2, locals=1, args_size=1
     0: aload_0
     1: getfield      #2                  // Field m:I
     4: iconst_1
     5: iadd
     6: ireturn
     LineNumberTable:
     line 12: 0
     LocalVariableTable:
     Start  Length  Slot  Name   Signature
     0       7     0  this   Lorg/jvm/demo/chapter6/TestClass;
     }
     SourceFile: "TestClass.java"

Por encima de versión menor , versión principal , banderas , Constant estos significados se entienden mejor.

Código de propiedad es la propiedad más importante de un archivo de clase, si la información es un programa Java en el código (código, método que el cuerpo de código Java) y metadatos (Metadata, incluyendo clases, campos, métodos y otra información definida) dos partes, todo el archivo de clase, descripción de atributos Código Código, todos los demás elementos de datos se utilizan para describir los metadatos.

Pila , sobre los locales es el atributo Código del contenido, los operandos de la pila pila; representa alrededor de los locales espacio de almacenamiento tabla de variables locales pertenece, la unidad es tragaperras, máquinas tragaperras variables locales virtuales asignados a la unidad más pequeña de uso de la memoria.

args_size representa el número de parámetros, la razón anterior es args_size 1, ya que habrá al menos un puntero a la instancia actual del objeto ejemplo variable de tabla variable local local del método, la tabla de variables locales también se fija a un lado una primera ranura poco para almacenar una referencia a la instancia del objeto.

LineNumberTable utiliza para describir los números de línea código fuente de Java relación entre el número de línea de código de bytes (código de bytes offset) correspondientes.

LocalVariableTable utiliza para describir la relación entre las variables en el marco de la pila de las variables de tabla de variables locales definidas en el código fuente de Java. LocalVariableTypeTable tipo genérico para el registro de firma característica (la firma) información.

De archivo de origen registros generados fuente de nombre de archivo de código del archivo de clase.

aload_0 , invokespecial , volver el foco de éstos pertenece a las instrucciones de código de bytes, no se describe en este artículo, en relación con las instrucciones de código de bytes, y otra información de atributo se puede leer "Java Virtual Machine Especificación."

Supongo que te gusta

Origin www.cnblogs.com/jmcui/p/12627180.html
Recomendado
Clasificación