java.lang.Object
jdk.dynalink.DynamicLinker
public final class DynamicLinker extends Object
RelinkableCallSite
オブジェクトのリンカー。 動的リンカーは、Dynalinkを使用する場合のメイン・オブジェクトであり、GuardingDynamicLinker
オブジェクト(独自のオブジェクト・モデルおよび/または型変換で言語ランタイムを実装している場合は、これらを処理する必要があります)で表される使用可能な言語ランタイムのリンカーとコール・サイトのリンクを調整します。 Dynalinkを使用するには、DynamicLinkerFactory
を使用して1つ以上の動的リンカーを作成する必要があります。 その後、invokedynamic
ブートストラップ・メソッドからlink(RelinkableCallSite)
メソッドを呼び出して、作成するすべてのコール・サイトを管理する必要があります。 通常、次のように1つのリンカー・インスタンスを格納するために、言語ランタイムごとに少なくとも1つのクラスを作成します:
class MyLanguageRuntime { private static final GuardingDynamicLinker myLanguageLinker = new MyLanguageLinker(); private static final DynamicLinker dynamicLinker = createDynamicLinker(); private static DynamicLinker createDynamicLinker() { final DynamicLinkerFactory factory = new DynamicLinkerFactory(); factory.setPrioritizedLinker(myLanguageLinker); return factory.createLinker(); } public static CallSite bootstrap(MethodHandles.Lookup lookup, String name, MethodType type) { return dynamicLinker.link( new SimpleRelinkableCallSite( new CallSiteDescriptor(lookup, parseOperation(name), type))); } private static Operation parseOperation(String name) { ... } }前述の1つの静的リンカー・インスタンスの設定は、多くの場合単純すぎます。 多くの場合、言語ランタイムには何らかの"コンテキスト・クラス・ローダー"の概念があり、このようなクラス・ローダーごとに1つの動的リンカーを作成して、そのクラス・ローダー(
DynamicLinkerFactory.setClassLoader(ClassLoader)
を参照してください)で表示される他のすべての言語ランタイムのリンカーが組み込まれるようにします。
上記の例では、3つのコンポーネントを用意する必要があります:
- 独自の言語に
GuardingDynamicLinker
を指定する必要があります。 ランタイムに独自のオブジェクト・モデルまたは型変換がない場合は、GuardingDynamicLinker
を実装する必要はありません。ファクトリでsetPrioritizedLinker
メソッドを起動するだけではありません。 - プログラムのパフォーマンスは、コール・サイトを表すクラスの選択によって決まります。 前述の例では、
SimpleRelinkableCallSite
を使用していましたが、かわりにChainedCallSite
を使用することをお薦めします。 ランタイムに最適なものを実験して決定する必要があります。 これらのサブクラスをさらに追加することも、独自のサブクラスを実装することもできます。 - また、コール・サイトに
CallSiteDescriptor
を指定する必要があります。 これらは、呼び出しサイトに関するすべての情報を含む不変オブジェクトです: ルックアップを実行するクラス、呼び出される操作およびメソッド・シグネチャ。 コール・サイト名または静的パラメータで操作をエンコードおよびデコードするには、独自のスキームを指定する必要があります。このため、前述の例では、parseOperation
メソッドが実装されていないままになります。
- 導入されたバージョン:
- 9
-
メソッドのサマリー
修飾子と型メソッド説明static StackTraceElement
現在のスレッドで現在リンクされているinvokedynamic
コール・サイトのロケーションを記述するスタック・トレース要素を返します。通常、個々のlanguage-specific linkers
に公開されるこのクラスのリンカー・サービスを表すオブジェクトを返します。<T extends RelinkableCallSite>
Tlink
(T callSite) ダイナミック・コール・サイトをリンクします。
-
メソッドの詳細
-
link
public <T extends RelinkableCallSite> T link(T callSite) ダイナミック・コール・サイトをリンクします。 このリンカーの再リンク・メカニズムを呼び出すメソッド・ハンドルを呼び出しサイトにインストールします。 次回コール・サイトが呼び出されると、呼び出された実際の引数に対してリンクされます。- 型パラメータ:
T
- リンクを作成するRelinkableCallSite
の特定のサブクラス。- パラメータ:
callSite
- リンクするコール・サイト。- 戻り値:
- callSiteを使用すると、コール・チェーンが容易になります。
-
getLinkerServices
public LinkerServices getLinkerServices()通常、個々のlanguage-specific linkers
に公開されるこのクラスのリンカー・サービスを表すオブジェクトを返します。 このクラスのユーザーの場合、通常はlink(RelinkableCallSite)
メソッドのみを使用しますが、特定の状況では、下位レベルのサービスを直接使用し、特定のメソッド・ハンドルをルックアップしたり、型コンバータにアクセスしたりできます。- 戻り値:
- このクラスのリンカー・サービスを表すオブジェクト。
-
getLinkedCallSiteLocation
public static StackTraceElement getLinkedCallSiteLocation()現在のスレッドで現在リンクされているinvokedynamic
コール・サイトのロケーションを記述するスタック・トレース要素を返します。 この操作は、スタック・トレースを生成して検査する必要があり、診断コードでの使用を目的としているため、コストがかかる可能性があります。 "free-floating"コール・サイト(invokedynamic
命令に関連付けられていない)の場合、結果は適切に定義されていません。- 戻り値:
- 現在リンクされているコール・サイトのロケーションを記述するスタック・トレース要素。コール・サイトがリンクされている間に呼び出されていない場合はnull。
-