public final class StringConcatFactory extends Object
おそらく型適応と引数の部分評価の後に既知の型の既知数の引数を効率的に連結するために使用できる文字列連結メソッドの作成を容易にするメソッド。 これらのメソッドは通常、Javaプログラミング言語の「文字列連結」機能をサポートするために、 invokedynamic
呼び出しサイト用の「ブートストラップ法」として使用されます。
提供された MethodHandle
で指定された動作への間接アクセスは、2つのフェーズを経て順番に進みます:
- リンケージ。このクラスのメソッドが呼び出されたときに発生します。 それらは、連結された引数の数と型、およびオプションでString recipeと、String連結に関与する定数を記述するメソッド型を引数として取ります。 受け入れられたレシピ・シェイプに関する詳細は、以下でさらに説明されます。 リンケージには、予想される連結動作を実装する新しいクラスを動的にロードする必要があります。
CallSite
は、正確な連結メソッドを指すMethodHandle
を保持します。 連結メソッドは、例えば、連結メソッドがそれらを純粋な関数として生成する場合、異なるCallSite
間で共有することができます。 - 「呼び出し」は、生成された連結メソッドが正確な動的引数で呼び出されたときに発生します。 これは、1回の連結メソッドで何度も発生することがあります。 ビヘイビア
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)
おそらく型適応と引数の部分的な評価の後に既知の型の既知の引数を効率的に連結するために使用できる最適化された文字列連結メソッドの作成を容易にします。
-
メソッドの詳細
-
makeConcat
public static CallSite makeConcat(MethodHandles.Lookup lookup, String name, MethodType concatType) throws StringConcatExceptionおそらく型適応と引数の部分的な評価の後に既知の型の既知の引数を効率的に連結するために使用できる最適化された文字列連結メソッドの作成を容易にします。 通常、invokedynamic
呼び出しサイト用の「ブートストラップ法」として使用され、Javaプログラミング言語の「文字列連結」機能をサポートします。このメソッドから返された
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の場合。 これは、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おそらく型適応と引数の部分的な評価の後に既知の型の既知の引数を効率的に連結するために使用できる最適化された文字列連結メソッドの作成を容易にします。 通常、invokedynamic
呼び出しサイト用の「ブートストラップ法」として使用され、Javaプログラミング言語の「文字列連結」機能をサポートします。このメソッドから返された
CallSite
のターゲットが呼び出されると、連結のための入力としてリンケージ・メソッドに渡されたすべての関数引数と定数を取って、String連結の結果を返します。 ターゲット・シグネチャはconcatType
で与えられ、定数は含まれません。 受け入れ対象:- ゼロの入力では、連結結果は空の文字列になります。
- 1つの入力、連結により、単一の入力がJLSごとに変換されます。5.1.11 "文字列変換"; さもないと
- 2つ以上の入力では、入力は、JLS 15.18.1 "文字列連結演算子+"に記載されている要件に従って連結されます。 入力は、JLS 5.1.11 "文字列変換"に従って変換され、左から右に結合されます。
連結recipeは、引数と定数から連結されたStringを構築するためのString記述です。 レシピは左から右に処理され、各文字は連結の入力を表します。 レシピ文字の意味:
- \1 (Unicodeポイント0001): 普通の議論。 この入力は動的引数を介して渡され、連結メソッド呼び出し中に提供されます。 この入力はnullでもかまいません。
- \2 (Unicodeポイント0002):定数。 この入力は、静的ブートストラップ引数を通過しました。 この定数は、定数プールで表現可能な任意の値にすることができます。 必要に応じて、ファクトリは
toString
を呼び出してワンタイム・ストリング変換を実行します。 - その他の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
- linkageメソッドに渡される定数を表すvarargパラメータです。- 戻り値:
- 指定された
concatType
で記述された動的連結引数を使用して、ターゲットを使用して文字列連結を実行できるCallSite。 - 例外:
StringConcatException
- ここで説明されているリンケージ不変条件のいずれかに違反があるか、ルックアップ・コンテキストにプライベート・アクセス権限がない場合。NullPointerException
- 入ってくる引数のいずれかがnullの場合、またはrecipe
の定数がnullの場合。 これは、invokedynamicでブートストラップ・メソッドが呼び出されたときには起こりません。- Java言語仕様を参照してください:
-
5.1.11 文字列変換
15.18.1文字列連結演算子+
-