- java.lang.Object
-
- jdk.dynalink.DynamicLinkerFactory
-
public final class DynamicLinkerFactory extends Object
用于创建DynamicLinker
对象的工厂类。 动态链接器是Dynalink的核心对象; 它们由几个GuardingDynamicLinker
对象组成,并协调呼叫站点与它们的链接。 通常的动态链接器是一个链接器,由工厂用户明确预先创建的所有GuardingDynamicLinker
对象组成,配置为setPrioritizedLinkers(List)
,以及任何automatically discovered
,最后配置为setFallbackLinkers(List)
; 最后一类通常包括BeansLinker
。
-
-
构造方法摘要
构造方法 构造器 描述 DynamicLinkerFactory()
使用默认配置创建新的动态链接器工厂。
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 DynamicLinker
createLinker()
根据当前配置创建新的动态链接器。List<ServiceConfigurationError>
getAutoLoadingErrors()
返回在上次调用createLinker()
期间加载自动发现的链接器时遇到的ServiceConfigurationError
的列表。void
setAutoConversionStrategy(MethodTypeConversionStrategy autoConversionStrategy)
设置表示自动类型转换的转换策略的对象。void
setClassLoader(ClassLoader classLoader)
设置类加载器以自动发现可用的保护动态链接器。void
setFallbackLinkers(List<? extends GuardingDynamicLinker> fallbackLinkers)
设置后备保护动态链接器。void
setFallbackLinkers(GuardingDynamicLinker... fallbackLinkers)
设置后备保护动态链接器。void
setInternalObjectsFilter(MethodHandleTransformer internalObjectsFilter)
设置一个方法句柄转换器,该转换器应该作为LinkerServices.filterInternalObjects(MethodHandle)
的实现,用于由此工厂创建的动态链接器的链接器服务。void
setPrelinkTransformer(GuardedInvocationTransformer prelinkTransformer)
设置预链接变压器。void
setPrioritizedLinker(GuardingDynamicLinker prioritizedLinker)
设置单个优先级链接器。void
setPrioritizedLinkers(List<? extends GuardingDynamicLinker> prioritizedLinkers)
设置优先级保护动态链接器。void
setPrioritizedLinkers(GuardingDynamicLinker... prioritizedLinkers)
设置优先级保护动态链接器。void
setSyncOnRelink(boolean syncOnRelink)
设置在重新链接调用站点后,此工厂创建的动态链接器是否将调用MutableCallSite.syncAll(MutableCallSite[])
。void
setUnstableRelinkThreshold(int unstableRelinkThreshold)
设置不稳定重新链接阈值; 呼叫站点重新链接的次数,之后它将被视为不稳定,随后的链接请求将指示此情况。
-
-
-
构造方法详细信息
-
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
- 优先连接子列表。 可以为null。 - 异常
-
NullPointerException
- 如果任何列表元素为null。
-
setPrioritizedLinkers
public void setPrioritizedLinkers(GuardingDynamicLinker... prioritizedLinkers)
设置优先级保护动态链接器。 与setPrioritizedLinkers(List)
和Arrays.asList(prioritizedLinkers)
相同。- 参数
-
prioritizedLinkers
- 一组优先连接子。 可以为null。 - 异常
-
NullPointerException
- 如果任何数组元素为null。
-
setPrioritizedLinker
public void setPrioritizedLinker(GuardingDynamicLinker prioritizedLinker)
设置单个优先级链接器。 与使用单元素列表调用setPrioritizedLinkers(List)
相同。- 参数
-
prioritizedLinker
- 单个优先级链接器。 不能为空。 - 异常
-
NullPointerException
- 如果传递null。
-
setFallbackLinkers
public void setFallbackLinkers(List<? extends GuardingDynamicLinker> fallbackLinkers)
设置后备保护动态链接器。 在任何自动发现和优先级链接器之后,当它链接调用站点时,最终将由生成的动态链接器查询这些链接器。 如果工厂还自动发现与其中一个回退链接器匹配的链接器类,则将忽略自动发现的类,并使用显式回退实例。- 参数
-
fallbackLinkers
- 回退链接器列表。 可以为空以表示调用者希望不设置回退链接器。 请注意,如果未显式调用此方法或将此方法传递为null,则工厂将创建BeansLinker
的实例以用作默认回退链接器。 - 异常
-
NullPointerException
- 如果任何列表元素为null。
-
setFallbackLinkers
public void setFallbackLinkers(GuardingDynamicLinker... fallbackLinkers)
设置后备保护动态链接器。 与致电setFallbackLinkers(List)
与Arrays.asList(fallbackLinkers)
相同。- 参数
-
fallbackLinkers
- 一系列后备链接器。 可以为空以表示调用者希望不设置回退链接器。 请注意,如果未显式调用此方法或将此方法传递为null,则工厂将创建BeansLinker
的实例以用作默认回退链接器。 - 异常
-
NullPointerException
- 如果任何数组元素为null。
-
setSyncOnRelink
public void setSyncOnRelink(boolean syncOnRelink)
设置在重新链接调用站点后,此工厂创建的动态链接器是否将调用MutableCallSite.syncAll(MutableCallSite[])
。 默认为false。 如果运行时支持动态链接代码的多线程执行,则可能需要将其设置为true。- 参数
-
syncOnRelink
- 如果在重新链接上调用同步,syncOnRelink
true,否则为false。
-
setUnstableRelinkThreshold
public void setUnstableRelinkThreshold(int unstableRelinkThreshold)
设置不稳定重新链接阈值; 呼叫站点重新链接的次数,之后它将被视为不稳定,随后的链接请求将指示此情况。 未明确设置时默认为8。- 参数
-
unstableRelinkThreshold
- 新阈值。 不得低于零。 值为零意味着呼叫站点永远不会被视为不稳定。 - 另请参见:
-
LinkRequest.isCallSiteUnstable()
-
setPrelinkTransformer
public void setPrelinkTransformer(GuardedInvocationTransformer prelinkTransformer)
设置预链接变压器。 这是一个GuardedInvocationTransformer
,它将在组件链接器创建并在动态链接器将其链接到调用站点之前获得最后的机会来修改受保护的调用。 它通常用于使调用的返回值类型适应调用站点的类型。 未明确设置时,将使用默认的预链接转换器,只需调用GuardedInvocation.asType(LinkerServices, MethodType)
。 很少需要定制的预链接变压器; 它们主要用作实现代码去优化策略等高级技术的构建块。- 参数
-
prelinkTransformer
- 动态链接器的预链接转换器。 可以为null使工厂使用默认变换器。
-
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
- 一个方法处理转换器过滤掉内部对象,或者为null。
-
createLinker
public DynamicLinker createLinker()
根据当前配置创建新的动态链接器。 可以多次调用此方法来创建多个动态链接器。 在每次调用此方法时,都会自动实例化自动发现的链接器。 允许在调用之间更改工厂的配置。 该方法不是线程安全的。 调用之后,调用者可以调用getAutoLoadingErrors()
来检索在尝试加载自动发现的链接器时发生的ServiceConfigurationError
的列表。 这些从不会从调用此方法中抛出,因为它会尽一切努力从它们中恢复并忽略失败的链接器。- 结果
- 新的动态链接器
-
getAutoLoadingErrors
public List<ServiceConfigurationError> getAutoLoadingErrors()
返回在上次调用createLinker()
期间加载自动发现的链接器时遇到的ServiceConfigurationError
的列表。 它们可以是任何非Dynalink特定的服务配置问题,以及工厂尝试自动加载的导出器时某些特定于Dynalink的错误:- 在具有安全管理器的系统中没有名为
GuardingDynamicLinkerExporter.AUTOLOAD_PERMISSION_NAME
的运行时权限,或者 - 从
Supplier.get()
返回null,或 - 从
Supplier.get()
返回的列表具有null元素。
- 结果
-
遇到
ServiceConfigurationError
的不可变列表。 可以是空的。
- 在具有安全管理器的系统中没有名为
-
-