-
public interface LinkerServices
GuardingDynamicLinker
实例由DynamicLinker
提供的服务接口。
-
-
方法摘要
所有方法 接口方法 抽象方法 Default Methods Modifier and Type 方法 描述 MethodHandle
asType(MethodHandle handle, MethodType fromType)
类似于MethodHandle.asType(MethodType)
,除了它也钩在由所有可用的GuardingTypeConverterFactory
实现产生的方法句柄中,提供参数的语言特定类型强制。default MethodHandle
asTypeLosslessReturn(MethodHandle handle, MethodType fromType)
类似于asType(MethodHandle, MethodType)
,除了它特别处理返回值类型转换。boolean
canConvert(Class<?> from, Class<?> to)
如果可能存在请求的类型(自动JVM转换或任何可用的GuardingTypeConverterFactory
提供的转换)之间的转换,则返回true;如果在请求的类型之间绝对不存在转换,则返回false。ConversionComparator.Comparison
compareConversion(Class<?> sourceType, Class<?> targetType1, Class<?> targetType2)
确定从源类型到两种目标类型的两种类型转换中的哪一种是首选。MethodHandle
filterInternalObjects(MethodHandle target)
修改方法句柄,以便可以接收潜在的内部语言运行时对象的任何参数都将添加一个过滤器,以防止它们转义,可能通过包装它们。GuardedInvocation
getGuardedInvocation(LinkRequest linkRequest)
创建一个守卫的调用委托回DynamicLinker
公开这个链接器服务对象。MethodHandle
getTypeConverter(Class<?> sourceType, Class<?> 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)
为所有原始数据到原始,包装到原始的,原始到包装的转换,以及所有upcasts。 对于所有其他的转换,它会插入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(Class<?> sourceType, Class<?> targetType)
给定一个源和目标类型,返回一个在它们之间进行转换的方法句柄。 不返回null; 在最坏的情况下,它将返回一个身份转换(在运行时可能会失败一些值)。 你很少需要直接使用这个方法,而应该主要依靠asType(MethodHandle, MethodType)
。 当需要在处理链接请求的上下文之前重用现有的类型转换机制时,需要这种方法。- 参数
-
sourceType
- 要转换的类型 -
targetType
- 要转换的类型 - 结果
- 执行转换的方法句柄。
-
canConvert
boolean canConvert(Class<?> from, Class<?> 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(Class<?> sourceType, Class<?> targetType1, Class<?> targetType2)
确定从源类型到两种目标类型的两种类型转换中的哪一种是首选。 这用于动态重载方法的分辨率。 如果源类型可以通过方法调用转换转换为正好一个目标类型,则会被选择,否则可以查询ConversionComparator
。- 参数
-
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
- 如果动作或lookupSupplier都为空。 - 另请参见:
-
GuardingTypeConverterFactory.convertToType(Class, Class, Supplier)
-
-