자바 가상 머신 사양 (SE8) - 클래스 파일 형식 (오)

4.7.1 정의하고 새 속성의 이름을

  그것은 정의하고 새로운 속성을 포함 구조, method_info 구조와 속성 코드 테이블의 구조 field_info, 클래스 파일 구조에 클래스 파일을 게시 할 수있는 컴파일러를 할 수 있습니다. 자바 가상 머신은 식별 및 새로운 속성 테이블 속성을 사용할 수 있습니다. 그러나, 클래스 파일 사양에 정의되지 않은 속성은 클래스 파일의 의미에 영향을 미칠 수 없습니다. 해당 속성을 무시 할 필요성을 인식하지 못하는 자바 가상 머신을 얻을 수 있습니다.

  예를 들어, 당신은 공급 업체 특정 디버깅을 지원하는 새로운 속성을 정의 할 수 있습니다. 자바 가상 재산을 인식하지 그들의 필요를 무시하기 때문에이이 파일을 클래스에 포함 된 추가 디버깅 정보를 달성하는 데 사용할 수 없습니다 수 있지만, 문서에 사용 된 특수 자바 가상 머신의 구현 클래스는, 다른 자바 가상 머신의 구현을 위해 사용할 수있다.

  이 예외가 발생합니다 몇 가지 새로운 특성 또는 클래스 파일을 사용하는 것을 거부 때문 자바 가상 머신 구현을 금지합니다. 물론,이 도구는 지정된 클래스 파일이 필요로하는 속성이 포함 된 경우 클래스 파일이 제대로 작동하지 않을 수 있습니다 실행됩니다.

  두 가지 속성을 가지고 있지만 동일한 속성 이름과 같은 길이,이 두 가지 속성을 식별 갈등을 달성하기 위해 가상 머신을 사용하는 일이있다. 이 사양에 정의 된 속성뿐만 아니라, 다른 속성의 이름을 설명하는 이름 지정 규칙 패키지 "Java 언어 사양, 자바 SE 버전 8"(JLS 6.1)에 따라 선택해야합니다.

  이 규격의 향후 버전은 추가 속성을 정의 할 수 있습니다.

4.7.2 ConstantValue 특성

  경우 고정 길이 ConstantValue 속성 field_info 구조 속성 테이블에있다. 다음의 시나리오에 대한 정수 표현을 나타내는 ConstantValue 속성 값 :

  • 플래그가 설정되면 ACC_STATIC 구조식 field_info 항목 access_flags 상기 field_info 구조에 의해 표시되는 필드는 클래스 또는 인터페이스 초기화 필드 (5.5) 문의 일부로 표현의 ConstantValue 속성의 값을 할당한다. (2.9) 클래스 초기화 메소드 나 클래스 또는 인터페이스 인터페이스를 호출하기 전에 발생합니다.
  • 그렇지 않으면, 자바 가상 머신이 속성을 무시합니다

  field_info 구조는 테이블이 대부분 일 개 ConstantValue 속성에서 할 수 있습니다 속성.

  다음과 같이 ConstantValue 속성 형식은 다음과 같습니다

ConstantValue_attribute {
    U2의 attribute_name_index;
    U4의 attribute_length;
    U2의 constantvalue_index;
}

  다음과 같이 각 항목 ConstantValue_attribute 구조는 다음과 같습니다

  attribute_name_index

    Attribute_name_index 값은 정수 풀 테이블의 유효한 인덱스해야합니다. 그 인덱스에서의 상수 풀 항목은 문자열 "ConstantValue"정수 UTF8 정보 구조 (4.4.7)도 있어야한다.

  attribute_length

    그 값이 있어야합니다.

  constantvalue_index

    Constantvalue_index 값은 정수 풀 테이블의 유효한 인덱스해야합니다. 속성에 의해 표시되는 소정의 일정한 값으로 인덱스의 상수 풀 항목. 표 4.7.2-A에 규정 된 상수 풀 엔트리는 필드의 타입에 적응되어야한다.

표 4.7.2-A. 상수 속성 유형

필드 형식 항목 유형
long CONSTANT_Long
float CONSTANT_Float
double CONSTANT_Double
intshortcharbyteboolean CONSTANT_Integer
String CONSTANT_String

 

4.7.3 코드 속성

  가변 길이 코드 property 속성은, 속성 테이블 구조를 method_info. 코드 속성은 인스턴스 초기화 방법, 또는 클래스 또는 인터페이스 초기화 방법 (2.9)를 포함하여 Java 가상 기계 명령어 방식과 보조 정보가 포함되어 있습니다.

  이 방법은, 네이티브 또는 추상 경우하는 방법은 테이블 정보 구조는 코드 속성하지 않아야 때문이다. 그렇지 않으면, 그 방법 속성 테이블의 정보 구조는 단지 코드 속성이 있어야합니다.

  다음과 같이 코드 속성의 형식은 다음과 같습니다

Code_attribute {
    U2의 attribute_name_index;
    U4의 attribute_length;
    U2의 max_stack;
    U2의 max_locals의;
    U4의 code_length;
    U1 코드 [code_length];
    U2의 exception_table_length;
    {U2의 start_pc;
        U2의 end_pc;
        U2의 handler_pc;
        U2의 catch_type;
    } [exception_table_length] exception_table;
    U2의 attributes_count;
    attribute_info는 [attributes_count] 속성;
}

  다음 구조이다 :

  attribute_name_index

    Attribute_name_index 값은 정수 풀 테이블의 유효한 인덱스해야합니다. 그 인덱스 상수 풀 항목은 문자열 "코드"상수 UTF8 정보 구조 (4.4.7)도 있어야합니다.

  attribute_length

    속성은 6 바이트의 시작을 포함하지 않는 길이를 나타냅니다.

  max_stack

    이 값은이 방법 오퍼랜드 스택이 실행 중에있어서의 최대 깊이를 제공한다.

  max_locals의

    max_locals의 값이 메소드를 호출 할 때 로컬 변수 파라미터를 전달하는 수단을 포함하는 로컬 변수의 호출 방법이 할당 로컬 변수 어레이의 엔트리 수 (2.6.1)를 제공한다.

    긴 또는 더블 타입의 가장 큰 지역 변수 인덱스 값은 max_locals의이다 - 2. 인덱스의 로컬 변수의 최대 값이 임의의 다른 유형의 max_locals 인 - 1.

  code_length

    또한이 방법에서는 바이트의 배열을 코드 값의 개수를 제공한다.

    이는 0보다 크고 65535 이하이어야, 즉 코드의 배열을 입력해야한다.

  암호[]

    코드 배열은 자바 가상 머신 코드를 달성하기위한이 방법의 실제 바이트를 제공한다.

    배열의 첫 번째 바이트가 4 바이트 경계에 정렬되는 경우 코드 배열 바이트 어드레싱 시스템에 메모리로 판독 될 때, 오프셋 tableswitch 및 lookupswitch32 비트는 4 바이트 정렬 될 것이다. (코드 배열 얼라인먼트 결과에 대한 더 많은 정보는, 이러한 명령어의 설명을 참조하시기 바랍니다.)

    코드 배열의 내용에 상세 제약에 별도 섹션 (4.9)에서 주어진 매우 광범위하다.

  exception_table_length

    이 값은 테이블의 수는 exception_table 엔트리 제공합니다.

  exception_table []

    exception_table 배열의 각각의 엔트리는 코드 배열의 하나의 예외 처리기를 설명한다. 표 순서 예외 핸들러 어레이 (2.10) 중요하다.

    Exception_table 각 항목은 네 다음이 포함되어 있습니다 :

    start_pc, end_pc

      두 항목 start_pc 및 end_pc 값 코드 배열 예외 핸들러의 유효 범위를 나타낸다. start_pc의 값은 옵 코드 명령어 코드 어레이의 유효 인덱스이어야한다. end_pc 값은 인스트럭션의 오피 코드의 어레이의 유효 인덱스이거나 배열 code_length 코드의 길이와 같아야한다. start_pc의 값은 end_pc의 값보다 작아야합니다.
      start_pc는 포함하고, end_pc는 배타적이다 프로그램 카운터 [start_pc, end_pc)는, 예외 핸들러가 유효해야하는 경우 즉,이다.
      end_pc는 Java 가상 머신이 역사적 오류를 디자인한다는 사실에 독점 : 자바 가상 머신 코드의 방법은 정확히 65535 바이트 인 경우와 1 바이트의 명령으로 종료 명령은 예외 처리 할 수 없다 프로그램 보호. 컴파일러의 작성자는, 임의의 방법, 예를 초기화하는 방법, 또는 자바 가상 머신 코드 65534 바이트의 최대 크기 제한에 의해 발생하는 정적 초기화 (코드 배열의 어떤 크기)이 오류를 해결할 수있다.

    handler_pc

      그 값은 예외 처리기의 시작 위치를 나타낸다. 그 값이 유효한 인덱스 번호 배열 및 명령 op 코드의 인덱스이어야한다.

    catch_type

      catch_type 항목이 0이 아닌 경우, 정수 풀 테이블에서 유효한 인덱스해야합니다. 색인 구조의 상수 풀 항목은 예외 핸들러는 예외 지정된 클래스를 캡처 할 수 있음을 나타냅니다 CONSTAN_Class_info (4.4.1)을해야합니다. 유일한 예외 처리기 경우 특정 클래스 또는 하위 클래스의 인스턴스 중 하나가 호출 될 때 예외가 발생합니다.
      이러한 유효성 검사가 발생하거나 하위 클래스 (4.9.2)이 발생 될 수 있습니다.
      값이 0 catch_type 항목의 경우,이 예외 핸들러를 호출 모든 예외였다.
      이것은 결국 (3.13)를 달성하는 데 사용됩니다.

  attributes_count

    그것은 단순히 속성 값 코드 속성의 수입니다.

  [특성

    속성 테이블의 각 값은 구성 (4.7) attribute_info한다.
    코드 속성과 연관된 선택적 속성의 수에는 제한이 없습니다.
    이 사양은 표 4.7-C의 속성 테이블의 코드 속성에 나열된 속성 정의에 나타납니다
    코드 속성에 정의 된 표 규칙 속성 속성에 주어진다 4.7.
    속성 미리 정의되지 않은 속성 규칙에 대한 코드 속성 테이블은 4.7.1에 제시되어있다.

추천

출처www.cnblogs.com/lilinwei340/p/11590497.html