java.lang.Object
jdk.dynalink.DynamicLinkerFactory
用于创建
DynamicLinker 对象的工厂类。动态链接器是 Dynalink 中的核心对象;这些由几个 GuardingDynamicLinker 对象组成,并协调调用站点与它们的链接。通常的动态链接器是由工厂用户显式预先创建并配置了setPrioritizedLinkers(List) 的所有GuardingDynamicLinker 对象组成的链接器,以及任何automatically discovered 对象,最后是配置了setFallbackLinkers(List) 的对象;最后一类通常包括 BeansLinker 。
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述基于当前配置创建一个新的动态链接器。返回在上次调用createLinker()期间加载自动发现的链接器时遇到的ServiceConfigurationError列表。voidsetAutoConversionStrategy(MethodTypeConversionStrategy autoConversionStrategy) 设置表示自动类型转换的转换策略的对象。voidsetClassLoader(ClassLoader classLoader) 设置类加载器以自动发现可用的保护动态链接器。voidsetFallbackLinkers(List<? extends GuardingDynamicLinker> fallbackLinkers) 设置回退保护动态链接器。voidsetFallbackLinkers(GuardingDynamicLinker... fallbackLinkers) 设置回退保护动态链接器。voidsetInternalObjectsFilter(MethodHandleTransformer internalObjectsFilter) 设置一个方法句柄转换器,该转换器应该充当LinkerServices.filterInternalObjects(MethodHandle)的实现,用于此工厂创建的动态链接器的链接器服务。voidsetPrelinkTransformer(GuardedInvocationTransformer prelinkTransformer) 设置预链接转换器。voidsetPrioritizedLinker(GuardingDynamicLinker prioritizedLinker) 设置单个优先链接器。voidsetPrioritizedLinkers(List<? extends GuardingDynamicLinker> prioritizedLinkers) 设置优先保护动态链接器。voidsetPrioritizedLinkers(GuardingDynamicLinker... prioritizedLinkers) 设置优先保护动态链接器。voidsetSyncOnRelink(boolean syncOnRelink) 设置此工厂创建的动态链接器是否将在调用站点重新链接后调用MutableCallSite.syncAll(MutableCallSite[])。voidsetUnstableRelinkThreshold(int unstableRelinkThreshold) 设置不稳定的重新链接阈值;调用站点被重新链接的次数,之后它将被视为不稳定,随后对其的链接请求将表明这一点。
-
构造方法详细信息
-
DynamicLinkerFactory
public DynamicLinkerFactory()使用默认配置创建一个新的动态链接器工厂。创建后,可以使用各种setXxx()方法配置工厂,并使用createLinker()根据其当前配置创建一个或多个动态链接器。
-
-
方法详情
-
setClassLoader
设置类加载器以自动发现可用的保护动态链接器。通过此类加载器可用的GuardingDynamicLinkerExporter实现将使用ServiceLoader机制自动实例化,并且它们提供的链接器将合并到该工厂创建的DynamicLinker中。这允许跨语言互操作性,其中属于该语言运行时的调用站点可以通过链接器从这些自动发现的运行时链接,如果它们的本机对象被传递到该运行时。如果未通过调用此方法显式设置类加载器,则将使用调用createLinker()的线程的线程上下文类加载器。如果使用 null 显式调用此方法,则ServiceLoader.loadInstalled(Class)将用于加载链接器。- 参数:
classLoader- 用于自动发现可用链接器的类加载器。
-
setPrioritizedLinkers
设置优先保护动态链接器。使用 Dynalink 的语言运行时通常至少有一个链接器用于它们自己的语言。在链接调用站点时,生成的动态链接器将首先咨询这些链接器,然后是任何自动发现和后备链接器。如果工厂还自动发现与优先链接器之一匹配的链接器类,则自动发现的类将被忽略并使用显式优先实例。- 参数:
prioritizedLinkers- 优先链接器列表。可以为空。- 抛出:
NullPointerException- 如果任何列表元素为空。
-
setPrioritizedLinkers
设置优先保护动态链接器。与使用Arrays.asList(prioritizedLinkers)调用setPrioritizedLinkers(List)相同。- 参数:
prioritizedLinkers- 一组优先链接器。可以为空。- 抛出:
NullPointerException- 如果任何数组元素为空。
-
setPrioritizedLinker
设置单个优先链接器。与使用单元素列表调用setPrioritizedLinkers(List)相同。- 参数:
prioritizedLinker- 单个优先链接器。不得为空。- 抛出:
NullPointerException- 如果传递了 null。
-
setFallbackLinkers
设置回退保护动态链接器。这些链接器将在链接调用站点时由生成的动态链接器最后查询,在任何自动发现和优先链接器之后。如果工厂还自动发现了一个与回退链接器之一匹配的链接器类,则自动发现的类将被忽略并使用显式回退实例。- 参数:
fallbackLinkers- 后备链接器列表。可以为空以指示调用者希望设置无后备链接器。请注意,如果未显式调用此方法或传递 null,则工厂将创建BeansLinker的实例以用作默认后备链接器。- 抛出:
NullPointerException- 如果任何列表元素为空。
-
setFallbackLinkers
设置回退保护动态链接器。与使用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
设置预链接转换器。这是一个GuardedInvocationTransformer,它将在组件链接器创建受保护的调用之后以及动态链接器将其链接到调用站点之前获得修改受保护调用的最后机会。它通常用于使调用的返回值类型适应调用站点的类型。如果未明确设置,将使用默认的预链接转换器,它只调用GuardedInvocation.asType(LinkerServices, MethodType)。很少需要定制的预链接转换器;它们主要用作实现高级技术(例如代码去优化策略)的构建块。- 参数:
prelinkTransformer- 动态链接器的预链接转换器。可以为空以让工厂使用默认转换器。
-
setAutoConversionStrategy
设置表示自动类型转换的转换策略的对象。在LinkerServices.asType(MethodHandle, MethodType)将所有自定义转换应用到方法句柄之后,它仍然需要影响method invocation conversions通常可以按照MethodHandle.asType(MethodType)自动应用。但是,有时语言运行时甚至希望为自己的调用站点自定义这些转换。一个典型的例子是允许空返回值的拆箱,这在默认情况下被普通的MethodHandles.asType()禁止。在这种情况下,语言运行时可以安装自己的自定义自动转换策略,该策略可以处理空值。请注意,当调用策略的MethodTypeConversionStrategy.asType(MethodHandle, MethodType)时,自定义语言转换将已经应用于方法句柄,因此根据设计,句柄的当前方法类型与所需的最终类型之间的差异将始终仅是可以受方法影响的类型调用转换。该策略也不需要调用最终的MethodHandle.asType(),因为这将作为最后一步在内部完成。- 参数:
autoConversionStrategy- 为该工厂创建的链接器应用方法调用转换的策略。对于没有自定义策略,可以为 null。
-
setInternalObjectsFilter
设置一个方法句柄转换器,该转换器应该充当LinkerServices.filterInternalObjects(MethodHandle)的实现,用于此工厂创建的动态链接器的链接器服务。某些语言运行时可以具有不应超出其范围的内部对象。他们可以在此处添加一个转换器来修改方法句柄,以便任何可以接收潜在内部语言运行时对象的参数都将添加一个过滤器,以防止它们转义,可能是通过包装它们。转换器还可以潜在地向返回值添加展开过滤器。DefaultInternalObjectFilter是作为方便类提供的,用于轻松创建此类滤波转换器。- 参数:
internalObjectsFilter- 处理转换器过滤掉内部对象的方法,或者为空。
-
createLinker
基于当前配置创建一个新的动态链接器。可以多次调用此方法来创建多个动态链接器。每次调用此方法时,都会重新实例化自动发现的链接器。允许在调用之间更改工厂的配置。该方法不是线程安全的。调用后,调用者可以调用getAutoLoadingErrors()来检索在尝试加载自动发现的链接器时出现的ServiceConfigurationError列表。这些永远不会从对此方法的调用中抛出,因为它会尽一切努力从中恢复并忽略失败的链接器。- 返回:
- 新的动态链接器
-
getAutoLoadingErrors
返回在上次调用createLinker()期间加载自动发现的链接器时遇到的ServiceConfigurationError列表。它们可以是任何非 Dynalink 特定的服务配置问题,以及工厂尝试自动加载的导出器时的一些特定于 Dynalink 的错误:- 在具有安全管理器的系统中没有名为
GuardingDynamicLinkerExporter.AUTOLOAD_PERMISSION_NAME的运行时权限,或者 - 从
Supplier.get()返回 null,或者 - 从
Supplier.get()返回的列表有一个空元素。
- 返回:
-
遇到的
ServiceConfigurationError的不可变列表。可以为空。
- 在具有安全管理器的系统中没有名为
-