モジュール jdk.dynalink
パッケージ jdk.dynalink

クラスDynamicLinker

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メソッドが実装されていないままになっているため、呼び出しサイト名または静的パラメータの操作をエンコードおよびデコードする独自のスキームを提供する必要があります。

  • メソッドの詳細

    • link

      public <T extends RelinkableCallSite> T link​(T callSite)
      invokedynamic呼び出しサイトをリンクします。 このリンカーの再リンク機構を呼び出すメソッド・ハンドルをコール・サイトにインストールします。 次にコール・サイトが呼び出されると、呼び出された実際の引数のためにリンクされます。
      型パラメータ:
      T - リンクを作成するRelinkableCallSiteの特定のサブクラスです。
      パラメータ:
      callSite - リンクするコール・サイト。
      戻り値:
      コール・チェーンを簡単にするためのcallSite。
    • getLinkerServices

      public LinkerServices getLinkerServices()
      通常、個々のlanguage-specific linkersに公開されるこのクラスのリンカー・サービスを表すオブジェクトを返します。 このクラスのユーザーは通常、link(RelinkableCallSite)メソッドのみを気にしますが、特定の状況では、より低いレベルのサービスを直接使用することもできます。特定のメソッド・ハンドルを検索したり、型コンバータにアクセスしたりすることができます。
      戻り値:
      このクラスのリンカー・サービスを表すオブジェクト。
    • getLinkedCallSiteLocation

      public static StackTraceElement getLinkedCallSiteLocation()
      現在のスレッドで現在リンクされているinvokedynamic呼び出しサイトのロケーションを記述するスタック・トレース要素を返します。 この操作は、検査するためにスタック・トレースを生成する必要があり、診断コードでの使用を想定しているため、潜在的に高価です。 "free-floating"呼び出しサイト(invokedynamic命令に関連付けられていない)の場合、結果は明確に定義されていません。
      戻り値:
      現在リンクされているコール・サイトのロケーションを記述するスタック・トレース要素。コール・サイトがリンクされている間に呼び出されない場合はnull。