Entendiendo la salida de javap para Constant Pool
java-bytecode-asm (3)
La agrupación constante de Java almacena dos tipos diferentes de entradas al almacenar una cadena. Primero, almacena la cadena literal como datos codificados en UTF-8 (aquí, constante # 23). En segundo lugar, también almacena una entrada de cadena (# 22) que indica que el contenido de la constante # 23 debe usarse para construir una String
. Creo que la razón de esto es que la JVM asocia con cada clase un "grupo de constantes de tiempo de ejecución" que consiste en una implementación dinámica de las constantes dadas. Para cadenas, esto puede ser una referencia al objeto String
internado que contiene los caracteres dados. Los datos constantes de UTF-8 tienen otros usos además de los literales de cadena (por ejemplo, nombrar campos y clases), por lo que esta indirección adicional parece ser una forma razonable de separar las preocupaciones.
Al ejecutar javap en una aplicación HelloWorld muy simple, tengo algo de confusión en la salida alrededor del conjunto constante.
Código de prueba
public class TestClass {
public static void main(String[] args) {
System.out.println("hello world");
}
}
Javap -c -verificación de salida (cortada)
// Header + consts 1..22 snipped
const #22 = String #23; // hello world
const #23 = Asciz hello world;
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/String;)V
Code:
Stack=2, Locals=1, Args_size=1
0: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #22; //String hello world
5: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
// Debug info snipped
}
Ok, así que en la línea 3 vemos un empuje de la constante "hola mundo" en la pila a través de # 22, pero const # 23 parece mantener el valor real. Creo que estoy un poco confundido con lo que significa el # (número) cuando aparece en el lado derecho de la impresión.
La página man de Oracle / Sun para javap deja mucho que desear.
La entrada de grupo # 22 es un objeto java.lang.String. La entrada # 23 es la matriz de caracteres que se usa para construir esa cadena.
El Java VM Spec es el "manual faltante" para javap.
Toda su class
, interface
, nombres de field
y constantes de string
entran en el conjunto constante de java.
Según la especificación de VM ( http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html ):
Constant_pool es una tabla de estructuras (§4.4) que representa varias constantes de cadena, nombres de clase e interfaz, nombres de campo y otras constantes a las que se hace referencia dentro de la estructura ClassFile y sus subestructuras. El formato de cada entrada de la tabla constant_pool se indica mediante su primer byte de "etiqueta". La tabla constant_pool se indexa de 1 a constant_pool_count-1.
Entonces, en términos de agrupación constante, algo como lo siguiente puede verse como:
const #22 = String #23; // hello world
const #23 = Asciz hello world;
El valor en # 22 (índice 22) es de tipo String
y su valor es nulo terminado cadena c ( Asciz ) hello world
está en el índice 23