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."