- java.lang.Object
-
- jdk.dynalink.DynamicLinkerFactory
-
public final class DynamicLinkerFactory extends Object
一个用于创建DynamicLinker
个对象的工厂类。 动态链接器是Dynalink的核心对象; 这些由几个GuardingDynamicLinker
对象组成,并调用呼叫站点的链接。 通常的动态接头是所有组成接头GuardingDynamicLinker
个对象明确由工厂的用户预先创建并与配置setPrioritizedLinkers(List)
,以及任何automatically discovered
级与被配置的,并且最后的那些setFallbackLinkers(List)
; 最后一类通常包括BeansLinker
。
-
-
构造方法摘要
构造方法 Constructor 描述 DynamicLinkerFactory()
创建一个默认配置的动态链接器工厂。
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 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的语言运行时通常至少有一个链接器用于自己的语言。 在链接呼叫站点之前,在任何自动发现和后备链接器之前,这些链接器将首先由生成的动态链接器进行查询。 如果工厂还自动发现一个匹配一个优先级链接器的链接器类,则autodiscovered类将被忽略,并且将使用显式的优先级实例。- 参数
-
prioritizedLinkers
- 优先级链接器的列表。 可以为null。 - 异常
-
NullPointerException
- 如果任何列表元素为空。
-
setPrioritizedLinkers
public void setPrioritizedLinkers(GuardingDynamicLinker... prioritizedLinkers)
设置优先级的守护动态链接器。 呼叫setPrioritizedLinkers(List)
与Arrays.asList(prioritizedLinkers)
相同。- 参数
-
prioritizedLinkers
- 一系列优先级连接器。 可以为null。 - 异常
-
NullPointerException
- 如果任何数组元素为空。
-
setPrioritizedLinker
public void setPrioritizedLinker(GuardingDynamicLinker prioritizedLinker)
设置单个优先级链接器。 与单元素列表调用setPrioritizedLinkers(List)
相同。- 参数
-
prioritizedLinker
- 单个优先级链接器。 不能为空。 - 异常
-
NullPointerException
- 如果null被传递。
-
setFallbackLinkers
public void setFallbackLinkers(List<? extends GuardingDynamicLinker> fallbackLinkers)
设置后备守护动态链接器。 在链接调用站点之后,在任何自动发现和优先级连接器之后,最终会由生成的动态链接器查询这些链接器。 如果工厂还自动发现与其中一个备用链接器匹配的链接器类,则autodiscovered类将被忽略,并且将使用显式的后备实例。- 参数
-
fallbackLinkers
- 备用链接器的列表。 可以是空的,以表示呼叫者希望不设置回退链接。 请注意,如果此方法未被明确调用或传递为空,那么工厂将创建一个BeansLinker
的实例作为默认回退链接器。 - 异常
-
NullPointerException
- 如果任何列表元素为空。
-
setFallbackLinkers
public void setFallbackLinkers(GuardingDynamicLinker... fallbackLinkers)
设置后备守护动态链接器。 呼叫setFallbackLinkers(List)
与Arrays.asList(fallbackLinkers)
相同。- 参数
-
fallbackLinkers
- 一系列备用链接器。 可以是空的,以表示呼叫者希望不设置回退链接。 请注意,如果未明确调用此方法或将其传递为空,那么工厂将创建一个BeansLinker
的实例作为默认回退链接器。 - 异常
-
NullPointerException
- 如果任何数组元素为空。
-
setSyncOnRelink
public void setSyncOnRelink(boolean syncOnRelink)
设置此工厂创建的动态链接是否在呼叫站点重新链接后调用MutableCallSite.syncAll(MutableCallSite[])
。 默认为false。 如果运行时支持动态链接代码的多线程执行,则可能需要将其设置为true。- 参数
-
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)
自动应用。 然而,有时候,语言运行时也希望为自己的呼叫站点定制这些转换。 一个典型的例子是允许取消装箱的null返回值,默认情况下这是普通的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()
返回的列表有一个空元素。
- 结果
-
一个不可变的列表遇到
ServiceConfigurationError
s。 可以是空的
- 在具有安全管理器的系统中没有名为
-
-