モジュール jdk.dynalink
パッケージ 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)
        起動型コールサイトをリンクします。 このリンカーの再リンクメカニズムを呼び出すメソッドハンドルを呼び出しサイトにインストールします。 コールサイトが次回呼び出されると、呼び出された実際の引数のためにリンクされます。
        型パラメータ:
        T - リンクを作成するRelinkableCallSiteの特定のサブクラス。
        パラメータ:
        callSite - リンクするコール・サイト。
        戻り値:
        簡単なコール連鎖のためのcallSite。
      • getLinkerServices

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

        public static StackTraceElement getLinkedCallSiteLocation()
        現在のスレッドで現在リンクされているinvokedynamicコール・サイトの位置を示すスタック・トレース要素を返します。 この操作は、検査のためにスタック・トレースを生成する必要があり、診断コードでの使用を目的としているため、コストがかかる可能性があります。 "free-floating"コール・サイト(invokedynamic命令に関連付けられていない)の場合、結果は適切に定義されません。
        戻り値:
        現在リンクされているコール・サイトの場所を記述するスタック・トレース要素。コール・サイトがリンクされているときに呼び出されない場合はnull。