Module  jdk.dynalink
软件包  jdk.dynalink

Class DynamicLinker



  • public final class DynamicLinker
    extends Object
    RelinkableCallSite对象的链接器。 动态链接器是使用Dynalink时的主要对象,它将调用站点的链接与由GuardingDynamicLinker对象表示的可用语言运行时的链接器进行协调(如果您自己正在使用自己的对象模型实现语言运行时,则只需处理这些对象和/或类型转换)。 要使用Dynalink,您必须使用DynamicLinkerFactory创建一个或多个动态链接器。 随后,您需要从invokedynamic引导方法调用其link(RelinkableCallSite)方法,让它管理他们创建的所有呼叫站点。 通常的用法是每个语言运行时至少创建一个类来包含一个链接器实例:
      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) {
             ...
         }
     } 
    上述一个静态链接器实例的设置通常太简单了。 您将经常使您的语言运行时具有某种“上下文类加载器”的概念,并且您将要为每个类加载器创建一个动态链接器,以确保它为该类加载器可见的所有其他语言运行时集成了链接器(请参阅DynamicLinkerFactory.setClassLoader(ClassLoader) )。

    在上面的例子中需要提供三个组件:

    • 您希望为您自己的语言提供一个GuardingDynamicLinker 如果您的运行时没有自己的对象模型或类型转换,则不需要实现GuardingDynamicLinker ; 您根本不会在工厂调用setPrioritizedLinker方法。
    • 程序的性能可以取决于您选择的类来表示呼叫站点。 以上示例使用SimpleRelinkableCallSite ,但您可能需要使用ChainedCallSite 您将需要尝试并确定最适合您的运行时。 您可以进一步子类化这些或实现您自己的。
    • 您还需要向您的呼叫站点提供CallSiteDescriptor 它们是包含关于呼叫站点的所有信息的不可变对象:执行查找的类,被调用的操作和方法签名。 您将必须提供自己的方案来编码和解码调用站点名称或静态参数中的操作,这就是为什么在上面的示例中, parseOperation方法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调用站点位置的堆栈跟踪元素。 该操作可能是昂贵的,因为它需要生成一个堆栈跟踪来检查它,并且用于诊断代码。 对于“自由浮动”呼叫站点(不与invokedynamic指令相关联),结果没有明确定义。
        结果
        描述当前正在链接的呼叫站点的位置的堆栈跟踪元素,如果在呼叫站点被链接时未调用,则为null。