-
public interface LinkerServices
拥有它们的DynamicLinker
提供给GuardingDynamicLinker
实例的服务的接口。
-
-
方法摘要
所有方法 实例方法 抽象方法 Default Methods 变量和类型 方法 描述 MethodHandle
asType(MethodHandle handle, MethodType fromType)
与MethodHandle.asType(MethodType)
类似,不同之处在于它还挂钩了由所有可用的GuardingTypeConverterFactory
实现生成的方法句柄,提供了特定于语言的类型的参数强制。default MethodHandle
asTypeLosslessReturn(MethodHandle handle, MethodType fromType)
与asType(MethodHandle, MethodType)
类似,但它特别处理返回值类型转换。boolean
canConvert(类<?> from, 类<?> to)
如果请求的类型(自动JVM转换或任何可用的GuardingTypeConverterFactory
提供的转换)之间可能存在转换,则返回true;如果请求的类型之间肯定不存在转换,则返回false。ConversionComparator.Comparison
compareConversion(类<?> sourceType, 类<?> targetType1, 类<?> targetType2)
确定从源类型到两种目标类型的两种类型转换中的哪一种是首选。MethodHandle
filterInternalObjects(MethodHandle target)
修改方法句柄,以便任何可以接收潜在内部语言运行时对象的参数都会在其上添加一个过滤器,以防止它们被包装,从而避免它们被转义。GuardedInvocation
getGuardedInvocation(LinkRequest linkRequest)
创建一个受保护的调用,该调用委托回公开此链接器服务对象的DynamicLinker
。MethodHandle
getTypeConverter(类<?> sourceType, 类<?> targetType)
给定源和目标类型,返回一个在它们之间进行转换的方法句柄。<T> T
getWithLookup(Supplier<T> operation, SecureLookupSupplier lookupSupplier)
在特定的MethodHandles.Lookup
查找对象的上下文中执行操作。
-
-
-
方法详细信息
-
asType
MethodHandle asType(MethodHandle handle, MethodType fromType)
与MethodHandle.asType(MethodType)
类似,不同之处在于它还挂钩了由所有可用的GuardingTypeConverterFactory
实现生成的方法句柄,提供了特定于语言的类型的参数强制。 它将MethodHandle.asType(MethodType)
应用于所有原始到原始的包装器到原语,原始到包装器的转换以及所有的向上转换。 对于所有其他转换,它将插入MethodHandles.filterArguments(MethodHandle, int, MethodHandle...)
,其中包含由GuardingTypeConverterFactory
实现提供的复合过滤器。- 参数
-
handle
- 目标方法句柄 -
fromType
- 源参数的类型 - 结果
- 一个方法句柄是的适当组合
MethodHandle.asType(MethodType)
,MethodHandles.filterArguments(MethodHandle, int, MethodHandle...)
,和MethodHandles.filterReturnValue(MethodHandle, MethodHandle)
与GuardingTypeConverterFactory
个 -produced型转换器,过滤器。
-
asTypeLosslessReturn
default MethodHandle asTypeLosslessReturn(MethodHandle handle, MethodType fromType)
与asType(MethodHandle, MethodType)
类似,但它特别处理返回值类型转换。 它只能转换方法句柄的返回类型,它可以使用既不会失去精度也不会失去大小的转换来完成,否则会保持不变。 这些是应由单个特定于语言的链接器执行的唯一返回值转换,pre-link transformer of the dynamic linker
应实现以特定于调用站点所在的语言运行时的方式处理潜在有损返回类型转换的策略。- 参数
-
handle
- 目标方法句柄 -
fromType
- 源参数的类型 - 结果
- 方法句柄是
MethodHandle.asType(MethodType)
和MethodHandles.filterArguments(MethodHandle, int, MethodHandle...)
以及GuardingTypeConverterFactory
生成的类型转换器作为过滤器的合适组合。
-
getTypeConverter
MethodHandle getTypeConverter(类<?> sourceType, 类<?> targetType)
给定源和目标类型,返回一个在它们之间进行转换的方法句柄。 永远不会返回null; 在最坏的情况下,它将返回一个标识转换(在运行时可能会失败某些值)。 您很少需要直接使用此方法,而应主要依赖asType(MethodHandle, MethodType)
。 当您需要在处理链接请求的上下文之外重用现有的类型转换机制时,需要此方法。- 参数
-
sourceType
- 要转换的类型 -
targetType
- 要转换为的类型 - 结果
- 执行转换的方法句柄。
-
canConvert
boolean canConvert(类<?> from, 类<?> to)
如果请求的类型(自动JVM转换或任何可用的GuardingTypeConverterFactory
提供的转换)之间可能存在转换,则返回true;如果请求的类型之间肯定不存在转换,则返回false。 请注意,返回true并不能保证转换在运行时对所有值都成功(特别是如果“from”或“to”类型足够通用),但返回false会保证转换失败。- 参数
-
from
- 转换的源类型 -
to
- 转换的目标类型 - 结果
- 如果可以进行转换,则为true;如果不存在,则为false。
-
getGuardedInvocation
GuardedInvocation getGuardedInvocation(LinkRequest linkRequest) throws 异常
创建一个保护的调用,该调用委托回公开此链接器服务对象的DynamicLinker
。 然后,动态链接器将自己委托链接到其所有托管GuardingDynamicLinker
,如果没有链接器更早响应,则可能包含此链接,因此请注意无限递归。 您通常会制作链接请求,以使其与您当前尝试链接的链接请求不同。- 参数
-
linkRequest
- 链接调用的请求 - 结果
- 由顶级动态链接器管理的一些保护动态链接器链接的受保护调用。 如果没有可用的链接器能够链接调用,则可以为null。 您通常会使用返回的调用的元素来组成您自己的调用。
- 异常
-
异常
- 如果顶级链接器抛出异常
-
compareConversion
ConversionComparator.Comparison compareConversion(类<?> sourceType, 类<?> targetType1, 类<?> targetType2)
确定从源类型到两种目标类型的两种类型转换中的哪一种是首选。 这用于动态重载方法解析。 如果源类型可以通过方法调用转换转换为恰好一个目标类型,则选择它,否则可以查阅ConversionComparator
s。- 参数
-
sourceType
- 源类型。 -
targetType1
- 一种潜在的目标类型 -
targetType2
- 另一种潜在的目标类型。 - 结果
- 比较常数之一,确定哪些 - 如果有的话 - 目标类型更适合转换。
-
filterInternalObjects
MethodHandle filterInternalObjects(MethodHandle target)
修改方法句柄,以便任何可以接收潜在内部语言运行时对象的参数都会在其上添加一个过滤器,以防止它们被包装,从而避免它们被转义。 它还可以为返回值添加一个展开过滤器。 基本上使用DynamicLinkerFactory.setInternalObjectsFilter(MethodHandleTransformer)
配置的变换器转换方法句柄。- 参数
-
target
- 目标方法句柄 - 结果
- 具有参数和/或返回类型的方法句柄,可能被过滤以进行包装和解包。
-
getWithLookup
<T> T getWithLookup(Supplier<T> operation, SecureLookupSupplier lookupSupplier)
在特定的MethodHandles.Lookup
查找对象的上下文中执行操作。 通常,LinkerServices
上的方法作为链接机制的一部分被调用,在这种情况下,Dynalink内部维护每线程当前查找(属于被链接的调用站点的描述符的查找)。 如果需要生成查找敏感转换器,则任何参与链接的GuardingTypeConverterFactory
都可以检索此查找。 但是,在实现调用时调度方案,在运行时调用转换等时,链接器服务的方法也可以在链接过程之外调用。如果在这种情况下需要使用任何类型转换器,并且需要查找,它将通常只获得MethodHandles.publicLookup()
因为线程没有参与链接操作。 如果有一种方法可以将操作有意义地关联到某个调用者类的上下文,请考虑在此方法的调用中执行它并为该类传递全强度查找,因为它会将该查找与当前线程关联持续时间。 请注意,由于您传递的是SecureLookupSupplier
,因此任何调用的类型转换器工厂仍需要保留必要的运行时权限,以便能够在需要时进行查找。- 参数类型
-
T
- 传入供应商提供的返回值的类型。 - 参数
-
operation
- 在指定查找的上下文中执行的操作。 -
lookupSupplier
- 查找的安全供应商 - 结果
- 动作的返回值
- 异常
-
NullPointerException
- 如果action或lookupSupplier为null。 - 另请参见:
-
GuardingTypeConverterFactory.convertToType(Class, Class, Supplier)
-
-