Java仮想マシン仕様(SE8) - クラスファイル形式(B)

4.4定数プール

  Java仮想マシン命令は、クラス、インタフェース動作、クラスインスタンスまたはアレイのレイアウトに依存しません。これとは対照的に、指示情報シンボルに一定のプールを利用しています。

  定数プールのエントリのすべての一般的な構造は次のようにあります。

cp_info { 
    U1タグ。
    U1情報[]; 
}

  定数プールテーブルは、各プロジェクトはcp_infoエントリの種類を示すために1ビットの開始フラグに基づいています。コンテンツ情報アレイはフラグによって決定されます。表4.4-Aに有効な識別子および対応する値。各フラグは、後で情報指定された定数を与える2バイト以上でなければなりません。追加情報のフォーマットは、ID値によって決定されます。

  表4.4定数プールID

定数型
CONSTANT_Class 7
CONSTANT_Fieldref 9
CONSTANT_Methodref 10
CONSTANT_InterfaceMethodref 11
CONSTANT_String 8
CONSTANT_Integer 3
CONSTANT_Float 4
CONSTANT_Long 5
CONSTANT_Double 6
CONSTANT_NameAndType 12
CONSTANT_Utf8 1
CONSTANT_MethodHandle 15
CONSTANT_MethodType 16
CONSTANT_InvokeDynamic 18

 

4.4.1 CONSTANT_Class_info構造

  CONSTANT_Class_info構造は、クラスまたはインタフェースを表すために使用されます。
CONSTANT_Class_info { 
    U1タグ。
    U2のname_index。
}

  次のようにプロジェクトCONSTANT_Class_info構造は次のとおりです。

  タグ

    フラグ値CONSTANT_Class(7)。

  name_index

    Name_index値は、定数プールテーブル内の有効なインデックスでなければなりません。この定数プールエントリ内のインデックス位置でなければならないCONSTANT_Utf8_info構造は、内部形式を使用してエンコードされている有効なバイナリクラスまたはインタフェース名を表します。

  配列はオブジェクトであり、(新たなバイトコードを含まない)バイトコードanewarrayのmultianewarrayため、アレイへの参照はCONSTANT_Class_info構造により定数プール内の「クラス」とすることができます。「クラス」のようなアレイのためのアレイ型記述子(4.3.2)のクラス名です。

  例えば、二次元配列型int []は[]のクラス名を表す[Iは、しかし、スレッドは[] [Ljava /ラング/スレッドのクラス名を表します。

  配列型記述子が有効である場合にのみ、配列の次元が255以下であり、

4.4.2 CONSTANT_Fieldred_info、CONSTANT_Methodref_info、およびCONTANT_InterfaceMethodref_info構造

  フィールド、メソッド、およびインタフェース・メソッド表すために類似した構造を使用します。

  

CONSTANT_Fieldref_info { 
    U1タグ。
    U2のclass_index。
    U2のname_and_type_index。
} 

CONSTANT_Methodref_info { 
    U1タグ。
    U2のclass_index。
    U2のname_and_type_index。
} 

CONSTANT_InterfaceMethodref_info { 
    U1タグ。
    U2のclass_index。
    U2のname_and_type_index。
}

  次のようにこのエントリ構造は次のとおりです。

  タグ

    タグ値はCONTANT_Fieldref_info CONSTANT_Fieldref(9)です。

    タグ値はCONTANT_Methodref_info CONSTANT_Methodref(10)です。

    タグ値はCONTANT_InterfaceMethodref_info CONSTANT_InterfaceMethodref(11)です。

  class_index

    Class_index値は、有効なインデックスconstant_poolテーブルでなければなりません。インデックス内のエントリは、クラスまたはインタフェースタイプのメンバーとして、フィールドまたはメソッドを表す位置CONSTANT_Class_info構造でなければなりません。

    class_index CONSTANT_Methodref_info構造はクラス型でなければならないインターフェイスタイプであります

    CONSTANT_InterfaceMethodref_infoエントリはclass_indexインターフェイスの型で表現されなければなりません

    class_indexエントリCONSTANT_Fieldref_infoの構造は、クラスタイプまたはインターフェイスタイプであってもよいです。

  name_and_type_index

    Name_and_type_index値は、有効なインデックスconstant_poolテーブルでなければなりません。インデックス内のエントリは、フィールドやメソッドの名前を示す位置CONSTANT_NameAndType_info構造、および記述子でなければなりません。

  CONSTANT_Fieldref_infoでは、記述子は、フィールド記述子を示している必要があります。これは、他の方法で記述子でなければなりません。

  構造体へのメソッドの名前CONSTANT_Methodref_info「<」(「の\ u003c」)が始まる場合、名前は特別な名前でなければならない<初期化>初期化方法の一例を表しています。その戻り型はvoidでなければなりません。

4.4.3 CONSTANT_String_info構造

  String型の定数オブジェクトを表すために使用CONSTANT_String_info構造

CONSTANT_String_info { 
    U1タグ。
    U2のstring_index。
}

  次のようにプロジェクトCONSTANT_String_info構造は次のとおりです。

  タグ

    タグ値はCONSTANT_String_info CONSTANT_String(8)です。

  string_index

    Class_index値は、有効なインデックスconstant_poolテーブルでなければなりません。インデックス内のエントリは、位置CONSTANT_Utf8_info構造である必要があり、Unicodeコードポイントのシーケンスは、Stringオブジェクトを初期化する必要があります。

4.4.4 CONSTANT_Integer_info構造とCONSTANT_Float_info

  4及び構造表さCONSTANT_Integer_info CONSTANT_Float_info一定バイトの値(整数および浮動小数点)。

CONSTANT_Integer_info { 
    U1タグ。
    U4バイト。
} 

CONSTANT_Float_info { 
    U1タグ。
    U4バイト。
}

  次のようにプロジェクトの構造は以下のとおりです。

  タグ

    タグCONSTANT_Integer_info構造はCONSTANT_Integer(3)です。

    タグ値のCONSTANT_Float_info構成CONSTANT_Float(4)。

  バイト

    CONSTANT_Integer_info項目は、バイトが格納された値のバイトのint型、ビッグエンディアンモードのint型の定数値を表しています。

    一定の浮動小数点値のCONSTANT_Float_infoバイトはIEEE 754単精度浮動小数点形式を使用して、項目を示します。ビッグエンディアンモードのエンディアン単一のフォーマット。

    CONSTANT_Float_info値は、以下の構造表現の規則によって決定されます。バイト値は、まず、INTに従って変換されます。

    ビットが0x7f800000変換された場合に1、次にフロートは正の無限大であります

    ビットが0xff800000変換された場合2、次いでフロートは負の無限大であります

    3、0x7f800001のビットは0xFFFFFFFFのに0x7FFFFFFFでまたは0xff800001間で変換場合、浮動小数点値はNaN。

    図4に示すように、他の場合には、次のように計算されたビット値flaotによれば:

    

INT S =((ビット>> 31)== 0)?1:-1 ;
INT E =((ビット>> 23)&0xffの)。
INT、M =(E == 0)?
          (ビット&0x7fffff)<< 1 
          (ビット&0x7fffff)| 0x800000;

    数式に等しいフロートのその後値。結果s · m · 2e-150

 4.4.6 CONSTANT_NameAndType_info構造

  CONSTANT_NameAndType_info構造が所属フィールドとメソッドを表すために使用されるが、クラスまたはインタフェースタイプに指定されていません。

CONSTANT_NameAndType_info { 
    U1タグ。
    U2のname_index。
    U2のdescriptor_index。
}

  次のようにプロジェクトCONSTANT_NameAndType_info構造は次のとおりです。

  タグ

    タグ項目CONSTANT_NameAndType_info構造CONSTANT_NameAndType(12)です。

  name_index

    Name_index値は、定数プールテーブルの有効なインデックスでなければなりません。このインデックスは位置CONSTANT_Utf8_info構造でなければならない特定のメソッド名の<init>または非限定的フィールドまたはメソッドの名前の有効な指標を表します。

  desciptor_index

    Name_index値は、定数プールテーブルの有効なインデックスでなければなりません。このインデックスはCONSTANT_Utf8_info構造は、フィールド記述子または記述子の効果的な方法を表している位置でなければなりません。

4.4.7 CONSTANT_Utf8_info構造

  CONSTANT_Utf8_info構造は、文字列定数の値を表すために使用されます。

  

CONSTANT_Utf8_info { 
    U1タグ。
    U2の長さ; 
    U1バイト[長さ]。
}

  次のような構造のプロジェクトは、次のとおりです。

  タグ

    タグ値CONSTANT_Utf8 CONSTANT_Utf8_info(1)。

  長さ

    バイトバイト長の配列内の値の数(列の長さではありません)。

  バイト[]

    バイトの文字列を含むバイト配列。

    値は、バイト(バイト)0ではありません

    値(バイト)0xffのバイト(バイト)の0xF0ではありません。

  UTF-8エンコーディングの補正を使用して文字列の内容。各コードポイントの修正UTF-8エンコーディングを使用する唯一のバイトコード点列を用いて表されている唯一の非ヌルASCII文字が含まれ、それは、コード空間内のすべてのUnicodeコードポイントを表すことができます。修正UTF-8は、NULL値で終わりません。次のように符号化プロセスです。

  コードポイント「\ u007F」ミッドレンジに「\ U0001」、表現するために単一のバイトを使用して:

  

0 ビット6-0

  図7は、コード・ポイントの数値を示しています。

  ヌルコードポイント(「\のU0000」)とコードポイントのxとyのペアを使用して、「\ u07FF」のバイト範囲に「\ u0080」が表されます。

  バツ:

1 1 0 ビット10-6

  そして、:

1 0 ビット5-0

  この2バイトのコードポイント値:

((X&0x1Fの)<< 6)+(Y&0x3fを)

  3バイトのX、Yの「\ uFFFF」を使用するコードポイント「\ u0800」において、Zは表されます:

  バツ:

1 1 1 0 ビット15-12

  そして、:

1 0 ビット11-6
 
  と:
1 0 ビット5-0
 
  :で示される3バイトのコードポイント値
  
((X&0xFの)<< 12)+((Y&0x3fを)<< 6)+(z&0x3fを)

  二つの薬剤で表されるU + FFFFの文字(いわゆる補足文字)上記のコードポイントが示されるUTF-16コード単位をエンコードします。3バイトコードで表される各エージェントユニット。これは、6バイトの文字で補足さU、V、W、Y、X、及びZが表します:

u
1 1 1 0 1 1 0 1
v
1 0 1 0 (ビット20-16)-1
w
1 0 ビット15-10
x
1 1 1 0 1 1 0 1
y
1 0 1 1 ビット9-6
z
1 0 ビット5-0

  6バイトのコードポイント値:

0x10000番地+((V&0x0Fの)<< 16)+((W&0x3fを)<< 10)+ 
((Y&0x0Fの)<< 6)+(z&0x3fを)

  マルチバイト文字は、クラスファイルに保存されているビッグエンディアンモード(上位バイトが最初)の順序でバイト。

  2つの違いとこの形式は「標準」UTF-8形式。まず、UTF-8文字列を補正するために2バイトフォーマットではなく、1バイトのヌル文字形式(CHAR)符号化のための0は、ヌルが埋め込まれることはありません。次に、標準UTF-8 1バイト、2バイト、3バイトのフォーマットを使用。Java仮想マシンは、標準的な4バイトUTF-8形式を認識しません。それは、独自の2 * 3バイト形式を使用しています。

おすすめ

転載: www.cnblogs.com/lilinwei340/p/11408611.html