2011-11-20 17 views
5

Piccola domanda sull'output generato dal comando javap relativo al pool costante. Quando javap stampe la piscina definisce le costanti stringa come Asciz stringhe, che capisco significa null Ascii terminato:Javap Asciz Strings

const #20 = Asciz  hello world; 

Ciò implicherebbe che la lunghezza della stringa non è noto, e per analizzare si dovrebbe leggere ogni byte fino a quando non si incontra lo null.

Tuttavia, la lunghezza delle costanti costanti della stringa di pool è definita dai due byte che precedono la stringa e non è presente null. (Constant pool specification).

Il definisce stringhe come Asciz in modo errato oppure Asciz ha un altro significato di cui non sono a conoscenza?

risposta

4

Vedi bug #6868539. È stato risolto in OpenJDK7, ora javap stampe Utf8 invece.

+0

Perfetto, bella scoperta. – Jivings

0

La const # 20 non è la stringa effettiva, ma i caratteri definiti UTF8 utilizzati per la stringa. Probabilmente hai un'altra costante che è una stringa che fa riferimento alla costante # 20. Le costanti asciz vengono utilizzate per altre cose rispetto alle stringhe come i nomi dei campi ecc. Le informazioni effettive contengono il tag UTF8, la lunghezza e i byte.

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

+2

Questo è quello che ho descritto nella mia breve definizione. In realtà ti sei collegato allo stesso riferimento che ho fatto io. Il fatto che definisce una stringa UTF8 e non una stringa ASCIZ è ciò a cui mi riferivo. – Jivings

+0

Dato che non c'era alcun riferimento alle stringhe ascii terminate null nella specifica del formato file di classe, pensavo che intendessi come le stringhe sono state definite nel pool. (Anche nella specifica 1.0 non ci sono stringhe ascii, ma piuttosto Unicode. Nessuna di esse è terminata con null). I jivings sembravano capire la tua domanda meglio di me. –

+0

Semplicemente, quello che volevo sapere è il motivo per cui si chiamano Asciz nel pool costante quando non sono chiaramente nulli. – Jivings