模块 jdk.dynalink

类 DynamicLinkerFactory

java.lang.Object
jdk.dynalink.DynamicLinkerFactory

public final class DynamicLinkerFactory extends Object
用于创建 DynamicLinker 对象的工厂类。动态链接器是 Dynalink 中的核心对象;这些由几个 GuardingDynamicLinker 对象组成,并协调调用站点与它们的链接。通常的动态链接器是由工厂用户显式预先创建并配置了setPrioritizedLinkers(List) 的所有GuardingDynamicLinker 对象组成的链接器,以及任何automatically discovered 对象,最后是配置了setFallbackLinkers(List) 的对象;最后一类通常包括 BeansLinker
  • 构造方法详细信息

    • DynamicLinkerFactory

      public DynamicLinkerFactory()
      使用默认配置创建一个新的动态链接器工厂。创建后,可以使用各种 setXxx() 方法配置工厂,并使用 createLinker() 根据其当前配置创建一个或多个动态链接器。
  • 方法详情

    • setClassLoader

      public void setClassLoader(ClassLoader  classLoader)
      设置类加载器以自动发现可用的保护动态链接器。通过此类加载器可用的 GuardingDynamicLinkerExporter 实现将使用 ServiceLoader 机制自动实例化,并且它们提供的链接器将合并到该工厂创建的 DynamicLinker 中。这允许跨语言互操作性,其中属于该语言运行时的调用站点可以通过链接器从这些自动发现的运行时链接,如果它们的本机对象被传递到该运行时。如果未通过调用此方法显式设置类加载器,则将使用调用 createLinker() 的线程的线程上下文类加载器。如果使用 null 显式调用此方法,则 ServiceLoader.loadInstalled(Class) 将用于加载链接器。
      参数:
      classLoader - 用于自动发现可用链接器的类加载器。
    • setPrioritizedLinkers

      public void setPrioritizedLinkers(List <? extends GuardingDynamicLinker > prioritizedLinkers)
      设置优先保护动态链接器。使用 Dynalink 的语言运行时通常至少有一个链接器用于它们自己的语言。在链接调用站点时,生成的动态链接器将首先咨询这些链接器,然后是任何自动发现和后备链接器。如果工厂还自动发现与优先链接器之一匹配的链接器类,则自动发现的类将被忽略并使用显式优先实例。
      参数:
      prioritizedLinkers - 优先链接器列表。可以为空。
      抛出:
      NullPointerException - 如果任何列表元素为空。
    • setPrioritizedLinkers

      public void setPrioritizedLinkers(GuardingDynamicLinker ... prioritizedLinkers)
      设置优先保护动态链接器。与使用 Arrays.asList(prioritizedLinkers) 调用 setPrioritizedLinkers(List) 相同。
      参数:
      prioritizedLinkers - 一组优先链接器。可以为空。
      抛出:
      NullPointerException - 如果任何数组元素为空。
    • setPrioritizedLinker

      public void setPrioritizedLinker(GuardingDynamicLinker  prioritizedLinker)
      设置单个优先链接器。与使用单元素列表调用 setPrioritizedLinkers(List) 相同。
      参数:
      prioritizedLinker - 单个优先链接器。不得为空。
      抛出:
      NullPointerException - 如果传递了 null。
    • setFallbackLinkers

      public void setFallbackLinkers(List <? extends GuardingDynamicLinker > fallbackLinkers)
      设置回退保护动态链接器。这些链接器将在链接调用站点时由生成的动态链接器最后查询,在任何自动发现和优先链接器之后。如果工厂还自动发现了一个与回退链接器之一匹配的链接器类,则自动发现的类将被忽略并使用显式回退实例。
      参数:
      fallbackLinkers - 后备链接器列表。可以为空以指示调用者希望设置无后备链接器。请注意,如果未显式调用此方法或传递 null,则工厂将创建 BeansLinker 的实例以用作默认后备链接器。
      抛出:
      NullPointerException - 如果任何列表元素为空。
    • setFallbackLinkers

      public void setFallbackLinkers(GuardingDynamicLinker ... fallbackLinkers)
      设置回退保护动态链接器。与使用 Arrays.asList(fallbackLinkers) 调用 setFallbackLinkers(List) 相同。
      参数:
      fallbackLinkers - 后备链接器数组。可以为空以指示调用者希望设置无后备链接器。请注意,如果未显式调用此方法或传递 null,则工厂将创建 BeansLinker 的实例以用作默认后备链接器。
      抛出:
      NullPointerException - 如果任何数组元素为空。
    • setSyncOnRelink

      public void setSyncOnRelink(boolean syncOnRelink)
      设置此工厂创建的动态链接器是否会在调用站点重新链接后调用 MutableCallSite.syncAll(MutableCallSite[]) 。默认为假。如果您的运行时支持动态链接代码的多线程执行,您可能希望将它设置为 true。
      参数:
      syncOnRelink - true 用于在重新链接时调用同步,否则为 false。
    • setUnstableRelinkThreshold

      public void setUnstableRelinkThreshold(int unstableRelinkThreshold)
      设置不稳定的重新链接阈值;调用站点被重新链接的次数,之后它将被视为不稳定,随后对其的链接请求将表明这一点。未明确设置时默认为 8。
      参数:
      unstableRelinkThreshold - 新门槛。不得小于零。零值意味着调用站点永远不会被认为是不稳定的。
      参见:
    • setPrelinkTransformer

      public void setPrelinkTransformer(GuardedInvocationTransformer  prelinkTransformer)
      设置预链接转换器。这是一个 GuardedInvocationTransformer ,它将在组件链接器创建受保护的调用之后以及动态链接器将其链接到调用站点之前获得修改受保护调用的最后机会。它通常用于使调用的返回值类型适应调用站点的类型。如果未明确设置,将使用默认的预链接转换器,它只调用 GuardedInvocation.asType(LinkerServices, MethodType) 。很少需要定制的预链接转换器;它们主要用作实现高级技术(例如代码去优化策略)的构建块。
      参数:
      prelinkTransformer - 动态链接器的预链接转换器。可以为空以让工厂使用默认转换器。
    • setAutoConversionStrategy

      public void setAutoConversionStrategy(MethodTypeConversionStrategy  autoConversionStrategy)
      设置表示自动类型转换的转换策略的对象。在 LinkerServices.asType(MethodHandle, MethodType) 将所有自定义转换应用到方法句柄之后,它仍然需要影响 method invocation conversions 通常可以按照 MethodHandle.asType(MethodType) 自动应用。但是,有时语言运行时甚至希望为自己的调用站点自定义这些转换。一个典型的例子是允许空返回值的拆箱,这在默认情况下被普通的 MethodHandles.asType() 禁止。在这种情况下,语言运行时可以安装自己的自定义自动转换策略,该策略可以处理空值。请注意,当调用策略的 MethodTypeConversionStrategy.asType(MethodHandle, MethodType) 时,自定义语言转换将已经应用于方法句柄,因此根据设计,句柄的当前方法类型与所需的最终类型之间的差异将始终仅是可以受方法影响的类型调用转换。该策略也不需要调用最终的MethodHandle.asType(),因为这将作为最后一步在内部完成。
      参数:
      autoConversionStrategy - 为该工厂创建的链接器应用方法调用转换的策略。对于没有自定义策略,可以为 null。
    • setInternalObjectsFilter

      public void setInternalObjectsFilter(MethodHandleTransformer  internalObjectsFilter)
      设置一个方法句柄转换器,该转换器应该充当 LinkerServices.filterInternalObjects(MethodHandle) 的实现,用于此工厂创建的动态链接器的链接器服务。某些语言运行时可以具有不应超出其范围的内部对象。他们可以在此处添加一个转换器来修改方法句柄,以便任何可以接收潜在内部语言运行时对象的参数都将添加一个过滤器,以防止它们转义,可能是通过包装它们。转换器还可以潜在地向返回值添加展开过滤器。 DefaultInternalObjectFilter 是作为方便类提供的,用于轻松创建此类滤波转换器。
      参数:
      internalObjectsFilter - 处理转换器过滤掉内部对象的方法,或者为空。
    • createLinker

      public DynamicLinker  createLinker()
      基于当前配置创建一个新的动态链接器。可以多次调用此方法来创建多个动态链接器。每次调用此方法时,都会重新实例化自动发现的链接器。允许在调用之间更改工厂的配置。该方法不是线程安全的。调用后,调用者可以调用 getAutoLoadingErrors() 来检索在尝试加载自动发现的链接器时出现的 ServiceConfigurationError 列表。这些永远不会从对此方法的调用中抛出,因为它会尽一切努力从中恢复并忽略失败的链接器。
      返回:
      新的动态链接器
    • getAutoLoadingErrors

      public List <ServiceConfigurationError > getAutoLoadingErrors()
      返回在上次调用 createLinker() 期间加载自动发现的链接器时遇到的 ServiceConfigurationError 列表。它们可以是任何非 Dynalink 特定的服务配置问题,以及工厂尝试自动加载的导出器时的一些特定于 Dynalink 的错误:
      返回:
      遇到的 ServiceConfigurationError 的不可变列表。可以为空。