2011-11-20 3 views
5

상수 풀에 관한 javap 명령에서 생성 된 출력에 대해 거의 질문하지 않습니다. javap 인쇄 이해가 Asciz 문자열로 문자열 상수를 정의하는 풀, null 종료 아스키 의미하는 경우 :Javap Asciz Strings

const #20 = Asciz  hello world; 

이 문자열의 길이를 알 수없는 것을 의미하는 것이며, 각 바이트를 읽을 것이다 구문 분석을 null이 발생할 때까지

그러나 정수 풀 문자열 상수의 길이는 문자열 앞에 오는 두 바이트로 정의되며 null이 추가되지 않습니다. (Constant pool specification).

javap은 문자열을 Asciz으로 잘못 정의합니까? 아니면 Asciz에 다른 의미가 있습니까?

답변

4

bug #6868539를 참조하십시오. OpenJDK7에서 수정되었습니다. 이제 javapUtf8을 대신 인쇄합니다.

+0

완벽하고 멋진 찾기. – Jivings

0

const # 20은 실제 문자열이 아니라 문자열에 사용 된 UTF8 정의 문자입니다. 상수 # 20을 참조하는 문자열 인 다른 상수가있을 수 있습니다. asciz 상수는 필드 이름 등의 문자열 이외의 다른 것에 사용됩니다. 실제 정보에는 UTF8 태그, 길이 및 바이트가 포함됩니다.

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

+2

이것은 제가 짧은 정의에서 설명한 것입니다. 실제로 내가했던 것과 같은 참고 자료에 링크되어 있습니다. ASCIZ 문자열이 아니라 UTF8 문자열을 정의한다는 사실은 내가 언급 한 것입니다. – Jivings

+0

클래스 파일 형식 사양에서 null로 끝나는 ASCII 문자열에 대한 참조가 없었기 때문에 나는 당신이 문자열이 풀에 정의 된 방법을 의미한다고 생각했습니다. (1.0 사양에서도 ASCII 문자열은 없지만 유니 코드는 없으며 아무 것도 null로 끝나지 않습니다.) Jivings는 나보다 당신의 질문을 더 잘 이해하는 것 같았다. –

+0

간단히 말해, 내가 알고 싶었던 것은 그들이 분명히 널 종료되지 않을 때 상수 풀에서 Asciz로 명명 된 이유입니다. – Jivings