クラスSwitchBootstraps
switch文の選択機能を実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。 ブートストラップは、switchのcaseラベルに対応する追加の静的引数を取り、暗黙的に[0..N)から番号付けします。 - 導入されたバージョン:
- 21
-
メソッドのサマリー
修飾子と型メソッド説明static CallSiteenumSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 列挙型のターゲットにswitchを実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。static CallSitetypeSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 参照タイプのターゲットにswitchを実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。
-
メソッドの詳細
-
typeSwitch
public static CallSite typeSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 参照タイプのターゲットにswitchを実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。 静的引数は、null以外で、String、Integer、ClassまたはEnumDesc型の大/小文字ラベルの配列です。返される
CallSiteのメソッド・ハンドルのタイプは、intという戻り型になります。 2つのパラメータがあります: 最初の引数はObjectインスタンス(target)で、2番目の引数はint(restart)になります。targetがnullの場合、コール・サイトのメソッドは -1を返します。targetがnullでない場合、コール・サイトのメソッドは、次のいずれかの条件に一致するrestart索引から始まるlabels配列内の最初の要素の索引を返します:- 要素のタイプが
Classで、ターゲット・クラスから割当て可能です。または - 要素のタイプは
StringまたはIntegerで、ターゲットと同等です。 - 要素のタイプは
EnumDescで、ターゲットと等しい定数を記述します。
labels配列内の要素がターゲットと一致しない場合、コール・サイトのメソッドはlabels配列の長さを返します。restart索引の値は、0(包含)からlabels配列(包含)の長さの間にある必要があります。そうでない場合、両方ともIndexOutOfBoundsExceptionがスローされます。- パラメータ:
lookup- コール元のアクセシビリティ権限を持つルックアップ・コンテキストを表します。invokedynamicで使用されるときは、これはVMによって自動的にスタックされます。invocationName- 未使用invocationType- 2つのパラメータ(参照タイプ、intおよびint)を含むCallSiteの起動タイプ。labels- ケース・ラベル -StringおよびInteger定数と、任意の組合せのClassおよびEnumDescインスタンス- 戻り値:
- 前述のとおり、
CallSiteは最初の一致する要素を返します - スロー:
NullPointerException- 引数が1つの場合はnullIllegalArgumentException- label配列の要素がnullの場合IllegalArgumentException- 起動型が参照型の第1パラメータのメソッド型でない場合は、int型の第2パラメータ、およびintを戻り型として使用IllegalArgumentException-labelsにString,Integer,Long,Float,Double,Boolean,Class型またはEnumDesc型の要素が含まれていない場合。IllegalArgumentException-targetがBoolean.classの場合、labelsにBoolean型の要素が含まれていない場合。- Java Virtual Machine仕様を参照してください:
-
「4.4.6 CONSTANT_NameAndType_info構造」
「4.4.10 CONSTANT_Dynamic_infoおよびCONSTANT_InvokeDynamic_info構造」
- 要素のタイプが
-
enumSwitch
public static CallSite enumSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 列挙型のターゲットにswitchを実装するinvokedynamicコール・サイトをリンクするためのブートストラップ・メソッド。 静的引数は、switchコンストラクトに関連付けられたcaseのラベルのエンコードに使用されます。ここでは、各ラベルを2つの方法でエンコードできます:String値として、ラベルに関連付けられている列挙定数の名前を表しますClass値として、タイプ・テスト・パターンに関連付けられた列挙型を表します
返された
CallSiteのメソッド・ハンドルの戻り型はintで、2つのパラメータを受け入れます: 最初の引数はEnumインスタンス(target)で、2番目の引数はint(restart)になります。targetがnullの場合、コール・サイトのメソッドは -1を返します。targetがnullでない場合、コール・サイトのメソッドは、次のいずれかの条件に一致するrestart索引から始まるlabels配列内の最初の要素の索引を返します:- 要素のタイプが
Classで、ターゲット・クラスから割当て可能です。または - 要素のタイプは
Stringで、ターゲット列挙定数Enum.name()と同等です。
labels配列内の要素がターゲットと一致しない場合、コール・サイトのメソッドはlabels配列の長さを返します。restart索引の値は、0(包含)からlabels配列(包含)の長さの間にある必要があります。そうでない場合、両方ともIndexOutOfBoundsExceptionがスローされます。- パラメータ:
lookup- コール元のアクセシビリティ権限を持つルックアップ・コンテキストを表します。invokedynamicで使用されるときは、これはVMによって自動的にスタックされます。invocationName- 未使用invocationType- 2つのパラメータ(列挙型、intおよびintの戻り型)を持つCallSiteの起動タイプ。labels- ケース・ラベル -String定数およびClassインスタンスの任意の組合せ- 戻り値:
- 前述のとおり、
CallSiteは最初の一致する要素を返します - スロー:
NullPointerException- 引数が1つの場合はnullIllegalArgumentException- ラベル配列内のいずれかの要素がNULLの場合、起動タイプが、最初のパラメータ・タイプが列挙型であるメソッド・タイプではない場合、int型の2番目のパラメータ、戻り型がintである場合、またはlabelsにターゲット列挙型のStringまたはClass型ではない要素が含まれる場合。- Java Virtual Machine仕様を参照してください:
-
「4.4.6 CONSTANT_NameAndType_info構造」
「4.4.10 CONSTANT_Dynamic_infoおよびCONSTANT_InvokeDynamic_info構造」
-