2011-11-20 20 views
5

Hay una pequeña duda sobre la salida generada por el comando javap con respecto al grupo constante. Cuando javap impresiones de la piscina se define constantes de cadena como Asciz cuerdas, que entiendo que significa null ASCII finalizada:Javap Asciz Strings

const #20 = Asciz  hello world; 

Esto implicaría que la longitud de la cadena no se conoce, y para analizar leerías cada byte hasta que encuentre el null.

Sin embargo, la longitud de las constantes constantes de cadena de grupo está definida por los dos bytes que preceden a la cadena y no hay null anexado. (Constant pool specification).

¿javap define cadenas como Asciz incorrectamente o Asciz tiene otro significado que no conozco?

Respuesta

4

Ver bug #6868539. Está arreglado en OpenJDK7, ahora javap imprime Utf8 en su lugar.

+0

Perfecto, buen descubrimiento. – Jivings

0

La const # 20 no es la cadena real, sino los caracteres definidos UTF8 utilizados para la cadena. Probablemente tengas otra constante que sea una cadena que haga referencia a la constante # 20. Las constantes asciz se utilizan para otras cosas que no sean cadenas, como nombres de campos, etc. La información real contiene la etiqueta UTF8, la longitud y los bytes.

Ver http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

+2

Esto es lo que describí en mi breve definición. De hecho, se vinculó a la misma referencia que yo. El hecho de que defina una cadena UTF8, y no una cadena ASCIZ es a lo que me refería. – Jivings

+0

Como no había referencia de cadenas ascii terminadas nulas en la especificación de formato de archivo de clase, pensé que quería decir cómo se definieron las cadenas en el grupo. (Incluso en la especificación 1.0 no hay cadenas de caracteres, sino Unicode. Ninguno de ellos tiene terminación nula). Jivings parecía entender tu pregunta mejor que yo. –

+0

Simplemente, lo que quería saber es por qué reciben el nombre de Asciz en el conjunto constante cuando claramente no tienen terminación nula. – Jivings