String連結メソッドの作成を容易にするメソッド。これは、既知の型の既知の数の引数を効率的に連結するために使用でき、型の適応後や引数の部分評価後にも使用できます。 これらのメソッドは、通常、Javaプログラミング言語の「文字列連結」機能をサポートするために、 invokedynamic
コール・サイトの「ブートストラップ法」として使用されます。
提供された MethodHandle
で指定された動作への間接アクセスは、2つのフェーズを経て順番に進みます:
- リンケージ。このクラスのメソッドが呼び出されたときに発生します。 これらは、引数として、連結された引数の数と型を記述するメソッド型、およびオプションで文字列recipeと、文字列連結に参加する定数を取ります。 受け入れられるレシピ・シェイプの詳細は、後述します。 リンケージには、想定される連結動作を実装する新しいクラスが動的にロードされる場合があります。
CallSite
は、正確な連結メソッドを指すMethodHandle
を保持します。 連結メソッドは、異なるCallSite
間で共有できます。たとえば、リンケージ・メソッドによって純粋な関数として生成される場合です。 - 「呼び出し」は、生成された連結メソッドが正確な動的引数とともに呼び出されたときに発生します。 これは、単一の連結メソッドで何度も発生する可能性があります。 動作
MethodHandle
によって参照されるメソッドは、MethodHandle.invoke(Object...)
のように、起動時に提供される静的引数および追加の動的引数を使用して呼び出されます。
このクラスは、2つの形式のリンケージ・メソッド: 動的引数のみを使用する単純バージョン(makeConcat(java.lang.invoke.MethodHandles.Lookup, String, MethodType)
)および拡張バージョン(定数引数の取得の高度な形式を使用するmakeConcatWithConstants(java.lang.invoke.MethodHandles.Lookup, String, MethodType, String, Object...)
)。 高度な戦略では、実行時に存在する文字列連結メソッドのシェイプの数を分解する代わりに、呼び出しバイトコードが大幅に改善される可能性があります。これらのシェイプには一定の静的引数も含まれるためです。
- APIのノート:
JVMの制限があります(クラス・ファイル構造制約): 255個を超えるスロットではメソッドをコールできません。 これにより、ブートストラップ・メソッドに渡すことができる静的引数および動的引数の数が制限されます。
MethodHandle
コンビネータを使用する可能性のある連結方法があるため、時間的な結果を取得するには、パラメータ・リストにいくつかの空のスロットを予約する必要があります。 このため、このファクトリのブートストラップ・メソッドは200を超える引数スロットを受け入れません。 200個を超える引数スロットを連結で必要とするユーザーは、大きい連結を小さい式で分割することが期待されます。- 導入されたバージョン:
- 9
-
フィールドのサマリー
-
メソッドのサマリー
修飾子と型メソッド説明static CallSite
makeConcat
(MethodHandles.Lookup lookup, String name, MethodType concatType) 最適化された文字列連結メソッドの作成を容易にします。このメソッドを使用すると、既知の型の引数(型の適応後や引数の部分評価後など)を効率的に連結できます。static CallSite
makeConcatWithConstants
(MethodHandles.Lookup lookup, String name, MethodType concatType, String recipe, Object... constants) 最適化された文字列連結メソッドの作成を容易にします。このメソッドを使用すると、既知の型の引数(型の適応後や引数の部分評価後など)を効率的に連結できます。static MethodHandle
makeConcatWithTemplate
(List<String> fragments, List<Class<?>> ptypes) Preview.StringTemplate
PREVIEW連結を容易にするための簡略化された連結メソッド。static List
<MethodHandle> makeConcatWithTemplateCluster
(List<String> fragments, List<Class<?>> ptypes, int maxSlots) Preview.このメソッドは、MethodHandle
ごとに必要なスロット数に基づいて、大きな連結を個別のMethodHandles
に分割します。static MethodHandle
makeConcatWithTemplateGetters
(List<String> fragments, List<MethodHandle> getters, int maxSlots) Preview.このメソッドは、指定されたgetterの受信側である1つの入力を予期するMethodHandle
を作成します。
-
フィールド詳細
-
MAX_INDY_CONCAT_ARG_SLOTS
public static final int MAX_INDY_CONCAT_ARG_SLOTSMAX_INDY_CONCAT_ARG_SLOTS
は、JavaプラットフォームのプレビューAPIです。プレビュー機能は、今後のリリースで削除するか、Javaプラットフォームの永続機能にアップグレードすることができます。String Concatコールの引数スロットの最大数。 インディ・コールで処理できる引数スロットの最大数は253ですが、これらのスロットをすべて使用しないため、MethodHandleコンビネータを使用する戦略で引数を使用できます。- 導入されたバージョン:
- 21
-
-
メソッドの詳細
-
makeConcat
public static CallSite makeConcat(MethodHandles.Lookup lookup, String name, MethodType concatType) throws StringConcatException 最適化された文字列連結メソッドの作成を容易にします。このメソッドを使用すると、既知の型の引数(型の適応後や引数の部分評価後など)を効率的に連結できます。 通常は、Javaプログラミング言語の「文字列連結」機能をサポートするために、invokedynamic
コール・サイトの「ブートストラップ法」として使用されます。このメソッドから返された
CallSite
のターゲットが呼び出されると、文字列連結の結果が返され、連結用の入力としてリンケージ・メソッドに渡されたすべての関数引数が取得されます。 ターゲット・シグネチャはconcatType
で与えられます。 受け入れ対象:- ゼロの入力では、連結結果は空の文字列になります。
- 1つの入力を連結すると、JLS 5.1.11 "文字列変換"に従って単一の入力が変換されます。それ以外の場合は、
- 2つ以上の入力の場合、JLS 15.18.1 "文字列連結演算子+"に記載されている要件に従って入力が連結されます。 入力は、JLS 5.1.11 "文字列変換"に従って変換され、左から右に組み合されます。
リンケージ引数は次のことを前提とします。
concatType
、CallSite
のシグネチャを記述
さらに、次のリンケージ不変条件を保持する必要があります。
concatType
のパラメータ・スロットの数が200以下ですconcatType
の戻り値の型はString
から代入可能です。
- パラメータ:
lookup
- コール元のアクセシビリティ権限を持つルックアップ・コンテキストを表します。 特に、参照コンテキストには「完全な権限アクセス」が必要です。invokedynamic
で使用されるときは、これはVMによって自動的にスタックされます。name
- 実装するメソッドの名前。 この名前は任意であり、このリンク・メソッドには意味がありません。invokedynamic
で使用されるときは、これはInvokeDynamic
構造のNameAndType
によって提供され、VMによって自動的にスタックされます。concatType
-CallSite
の予想されるシグネチャ。 パラメータ型は、連結引数の型を表します。戻り値の型は常にString
から割り当て可能です。invokedynamic
で使用されるときは、これはInvokeDynamic
構造のNameAndType
によって提供され、VMによって自動的にスタックされます。- 戻り値:
- 指定された
concatType
で記述された動的な連結引数を使用して、文字列連結の実行にターゲットを使用できるCallSite。 - 例外:
StringConcatException
- ここで説明されているリンケージ不変条件のいずれかに違反があるか、ルックアップ・コンテキストにプライベート・アクセス権限がない場合。NullPointerException
- 受信引数のいずれかがnullの場合。 これは、bootstrapメソッドがinvokedynamicを使用してコールされた場合には発生しません。- Java言語仕様を参照してください:
-
5.1.11 文字列変換
15.18.1文字列連結演算子+
-
makeConcatWithConstants
public static CallSite makeConcatWithConstants(MethodHandles.Lookup lookup, String name, MethodType concatType, String recipe, Object... constants) throws StringConcatException 最適化された文字列連結メソッドの作成を容易にします。このメソッドを使用すると、既知の型の引数(型の適応後や引数の部分評価後など)を効率的に連結できます。 通常は、Javaプログラミング言語の「文字列連結」機能をサポートするために、invokedynamic
コール・サイトの「ブートストラップ法」として使用されます。このメソッドから返された
CallSite
のターゲットが呼び出されると、文字列連結の結果が返され、連結用の入力としてリンケージ・メソッドに渡されるすべての関数引数および定数が使用されます。 ターゲット・シグネチャは、concatType
で指定され、定数は含まれません。 受け入れ対象:- ゼロの入力では、連結結果は空の文字列になります。
- 1つの入力を連結すると、JLS 5.1.11 "文字列変換"に従って単一の入力が変換されます。それ以外の場合は、
- 2つ以上の入力の場合、JLS 15.18.1 "文字列連結演算子+"に記載されている要件に従って入力が連結されます。 入力は、JLS 5.1.11 "文字列変換"に従って変換され、左から右に組み合されます。
連結recipeは、引数および定数から連結文字列を構築する方法の文字列の説明です。 レシピは左から右に処理され、各文字は連結への入力を表します。 レシピ文字の意味:
- \1 (Unicodeポイント0001): 普通の議論。 この入力は動的引数を介して渡され、連結メソッドの起動時に提供されます。 この入力はnullにできます。
- \2 (Unicodeポイント0002): 定数。 この入力は静的ブートストラップ引数を介して渡されます。 この定数は、定数プールで表現できる任意の値です。 必要に応じて、ファクトリは
toString
をコールして、1回かぎりの文字列変換を実行します。 - その他のchar値: 単一の文字定数。
リンケージ引数は次のことを前提とします。
concatType
、CallSite
のシグネチャを記述recipe
、文字列のレシピを記述constants
、定数の可変配列
さらに、次のリンケージ不変条件を保持する必要があります。
concatType
のパラメータ・スロットの数が200以下ですconcatType
のパラメータ数は、recipe
の\1タグ数と同じですconcatType
の戻り値の型はString
から代入可能で、返されるMethodHandle
の戻り値の型と一致constants
の要素の数は、recipe
の\2タグの数と同じです
- APIのノート:
- コード・ジェネレータには、文字列連結式で定数文字列オペランドSを処理する3つの異なる方法があります。 まず、Sは参照(ldcを使用して)として実体化でき、通常の引数(レシピ'\1')として渡されます。 または、Sを定数プールに格納し、定数(レシピ'\2')として渡すことができます。 最後に、Sにレシピ・タグ文字('\1', '\2')が含まれていない場合、Sはレシピ自体に補間され、その結果にその文字が挿入されます。
- パラメータ:
lookup
- コール元のアクセシビリティ権限を持つルックアップ・コンテキストを表します。 特に、参照コンテキストには「完全な権限アクセス」が必要です。invokedynamic
で使用されるときは、これはVMによって自動的にスタックされます。name
- 実装するメソッドの名前。 この名前は任意であり、このリンク・メソッドには意味がありません。invokedynamic
で使用されるときは、これはInvokeDynamic
構造のNameAndType
によって提供され、VMによって自動的にスタックされます。concatType
-CallSite
の予想されるシグネチャ。 パラメータ型は、動的連結引数の型を表します。戻り値の型は常にString
から割り当て可能です。invokedynamic
で使用されるときは、これはInvokeDynamic
構造のNameAndType
によって提供され、VMによって自動的にスタックされます。recipe
- 前述の連結レシピ。constants
- リンケージ・メソッドに渡される定数を表すvarargパラメータ。- 戻り値:
- 指定された
concatType
で記述された動的な連結引数を使用して、文字列連結の実行にターゲットを使用できるCallSite。 - 例外:
StringConcatException
- ここで説明されているリンケージ不変条件のいずれかに違反があるか、ルックアップ・コンテキストにプライベート・アクセス権限がない場合。NullPointerException
- 受信引数のいずれかがnullの場合、またはrecipe
の定数がnullの場合。 これは、bootstrapメソッドがinvokedynamicを使用してコールされた場合には発生しません。- Java言語仕様を参照してください:
-
5.1.11 文字列変換
15.18.1文字列連結演算子+
-
makeConcatWithTemplate
public static MethodHandle makeConcatWithTemplate(List<String> fragments, List<Class<?>> ptypes) throws StringConcatException makeConcatWithTemplate
は、JavaプラットフォームのプレビューAPIです。プレビュー機能が有効な場合のみ、プログラムでmakeConcatWithTemplate
を使用できます。プレビュー機能は、今後のリリースで削除するか、Javaプラットフォームの永続機能にアップグレードすることができます。StringTemplate
PREVIEW連結を容易にするための簡略化された連結メソッド。 このメソッドは、フラグメントと値をインターリーブする単一の連結メソッドを返します。fragment|value|fragment|value|...|value|fragment。 フラグメントの数は、ptypesの数以上である必要があります。 ptypesで使用されるスロットの合計数は、MAX_INDY_CONCAT_ARG_SLOTS
PREVIEW以下である必要があります。- パラメータ:
fragments
- 文字列フラグメントのリストptypes
- 式タイプのリスト- 戻り値:
- 連結用の
MethodHandle
- 例外:
StringConcatException
- いずれかのリンク不変が違反している場合。NullPointerException
- 受信引数のいずれかがnullの場合。IllegalArgumentException
- 値スロットの数がMAX_INDY_CONCAT_ARG_SLOTS
PREVIEWを超える場合。- 導入されたバージョン:
- 21
-
makeConcatWithTemplateCluster
public static List<MethodHandle> makeConcatWithTemplateCluster(List<String> fragments, List<Class<?>> ptypes, int maxSlots) throws StringConcatException makeConcatWithTemplateCluster
は、JavaプラットフォームのプレビューAPIです。プレビュー機能が有効な場合のみ、プログラムでmakeConcatWithTemplateCluster
を使用できます。プレビュー機能は、今後のリリースで削除するか、Javaプラットフォームの永続機能にアップグレードすることができます。このメソッドは、MethodHandle
ごとに必要なスロット数に基づいて、大きな連結を個別のMethodHandles
に分割します。 最初のMethodHandle
以降の各String
スロットには、前のMethodHandle
の結果用に追加のString
スロットがあります。makeConcatWithTemplate(java.util.List<java.lang.String>, java.util.List<java.lang.Class<?>>)
PREVIEWは、MethodHandles
の構成に使用されます。 ptypesで使用されているスロットの合計数はopen endです。 ただし、結合の合計が255スロット制限を超えないように、MethodHandles
を組み合わせる場合は注意が必要です。- パラメータ:
fragments
- 文字列フラグメントのリストptypes
- 式タイプのリストmaxSlots
-MethodHandle
ごとのスロットの最大数。- 戻り値:
MethodHandles
のリスト- 例外:
IllegalArgumentException
- maxSlotsが1からMAX_INDY_CONCAT_ARG_SLOTSの間でない場合。StringConcatException
- いずれかのリンク不変が違反している場合。NullPointerException
- 受信引数のいずれかがnullの場合。IllegalArgumentException
- 値スロットの数がMAX_INDY_CONCAT_ARG_SLOTS
PREVIEWを超える場合。- 導入されたバージョン:
- 21
-
makeConcatWithTemplateGetters
public static MethodHandle makeConcatWithTemplateGetters(List<String> fragments, List<MethodHandle> getters, int maxSlots) throws StringConcatException makeConcatWithTemplateGetters
は、JavaプラットフォームのプレビューAPIです。プレビュー機能が有効な場合のみ、プログラムでmakeConcatWithTemplateGetters
を使用できます。プレビュー機能は、今後のリリースで削除するか、Javaプラットフォームの永続機能にアップグレードすることができます。このメソッドは、指定されたgetterの受信側である1つの入力を予期するMethodHandle
を作成します。 このメソッドは、makeConcatWithTemplateCluster(java.util.List<java.lang.String>, java.util.List<java.lang.Class<?>>, int)
PREVIEWを使用して中間MethodHandles
を作成します。- パラメータ:
fragments
- 文字列フラグメントのリストgetters
- getterのリストMethodHandles
maxSlots
- クラスタ内のMethodHandle
あたりの最大スロット数。- 戻り値:
- 連結用の
MethodHandle
- 例外:
IllegalArgumentException
- maxSlotsが1からMAX_INDY_CONCAT_ARG_SLOTSの間にない場合、またはgetterが同じ引数タイプを使用しない場合StringConcatException
- いずれかのリンケージ不変条件に違反している場合NullPointerException
- 着信引数のいずれかがnullの場合IllegalArgumentException
- 値スロットの数がMAX_INDY_CONCAT_ARG_SLOTS
PREVIEWを超える場合。- 導入されたバージョン:
- 21
-
MAX_INDY_CONCAT_ARG_SLOTS
を使用できます。