モジュール 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メソッドが実装されていないままになります。

導入されたバージョン:
9