2014-04-10 5 views
1

I 클래스 파일의 상수 풀 섹션에서 다음 두 항목을 알아 내려고 노력하고 있어요 :방법 서명 및 클래스 파일 정수 풀 (은 javap)에서 설명

int foo(int x) { 
    return x; 
} 

#11 = Utf8    foo 
#12 = Utf8    (I)I  // 1 
#13 = Utf8    x 
#14 = Utf8    I   // 2 

이 항목을합니까 (1) -> (I) I는 함수의 시작을 나타내고 엔트리 (2) -> I는 함수의 끝을 나타냅니다.

이 컴파일러는 특정 또는 컴파일러마다 다를 수 있습니까?

람다 기능에 대해서도 비슷한 질문이 있습니다.

interface I { int foo(int x); } 
class X { 
I x = (int x1) -> 0; 
} 

#15 = Utf8   lambda$new$0 
#16 = Utf8   (I)I 
#17 = Utf8   x1 
#18 = Utf8   I 

죄송합니다. JLS 문서에서 아무 것도 찾을 수 없습니다.

감사

답변

4

상수 풀은 "방법의 시작"과 "방법 끝"의 개념이 없습니다.

여기서 볼 수있는 것은 상수 풀에서 유형이 "Utf8"인 문자열 상수입니다. 풀의 관점에서 볼 때 이들은 단지 문자열 일뿐입니다. 그러나 여러 가지를 나타내는 컴파일러 생성 문자열입니다. 이 문자열은 필수이며 형식은 JVMS에 설명되어 있습니다. 몇 가지 유형이 있습니다. 당신의 람다 예에서 :

  • lambda$new$0 -이 4.3.4에 설명 된 서명이다.
  • (I)I -이 4.3.3
  • I에 기재된 방법 디스크립터 (서명과 동일하지 않음)이다 - 이것은 4.3.2에 기재된 필드 디스크립터이다.

I 항목은 단지 int 필드입니다.

(I) I 항목의 경우 (..) 사이의 문자열이 매개 변수 유형입니다. 목록 일 수 있습니다. I은 기본 유형 int입니다. (..) 외부의 문자열이 반환 형식입니다. 따라서 (I) Iint을 허용하는 매개 변수 목록과 반환 유형 int을 사용하는 방법을 설명합니다. 이러한 문자열은 여전히 ​​있다는 것이

 
Character  Type  Interpretation 
B    byte  signed byte 
C    char  Unicode character code point in the Basic 
          Multilingual Plane, encoded with UTF-16 
D    double  double-precision floating-point value 
F    float  single-precision floating-point value 
I    int  integer 
J    long  long integer 
L ClassName; reference an instance of class ClassName 
S    short  signed short 
Z    boolean true or false 
[    reference one array dimension 

주 : (table 4.2)에서 FieldType

MethodDescriptor: 
    (ParameterDescriptor*) ReturnDescriptor 

ParameterDescriptor: 
    FieldType 

ReturnDescriptor: 
    FieldType 
    VoidDescriptor 

VoidDescriptor: 
    V 

:

는 구체적 JVMS에서, 방법 디스크립터 문자열의 형식을 다른 것처럼. 실제로 이러한 메서드를 호출 할 때 다른 종류의 항목 - method reference - 상수 풀에 나타납니다.(문자열에 "UTF8"를 반대) javap는 "NameAndType"유형이를 식별하고, 그들은 (첫 번째 예를 사용) 등의 형태를 취할 것입니다 : 그들은뿐만 아니라 메소드 이름 문자열을 참조

#123 = NameAndType  #11:#12; // "foo":(I)I 

을 설명자 문자열.

javap 설명서 자체는 드문 드문 하나 명령 줄 정보 만 포함되어 있습니다. JVMS는 javap에있는 상세한 설명서에 가장 가까운 것입니다.

+0

부끄럽습니다. 나는 int가되어야한다고 생각합니다. 감사. – gudge

+0

@ JasonC 컴퓨터로 돌아 가면 정확한 의미를 확인해야 하겠지만 그게 그 의미입니다. –

+1

@Jason 실제로 그는 맞습니다. 메소드가 참조하는 상수 풀 항목입니다. 이것은 디버깅 정보가 아닙니다. 모든 메소드에는 이름과 설명자가 있어야합니다. – Antimony