public interface LinkerServices
由拥有它们的
DynamicLinker
提供给 GuardingDynamicLinker
实例的服务接口。
-
Method Summary
Modifier and TypeMethodDescriptionasType
(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。compareConversion
(Class<?> sourceType, Class<?> targetType1, Class<?> targetType2) 确定从源类型到两个目标类型的两种类型转换中哪一种更优先。filterInternalObjects
(MethodHandle target) 修改方法句柄,以便任何可能接收内部语言运行时对象的参数都会添加一个过滤器,防止它们逃逸,可能通过包装它们。getGuardedInvocation
(LinkRequest linkRequest) 创建一个受保护的调用,委托给公开此链接器服务对象的DynamicLinker
。getTypeConverter
(Class<?> sourceType, Class<?> targetType) 给定源类型和目标类型,返回一个在它们之间进行转换的方法句柄。<T> T
getWithLookup
(Supplier<T> operation, SecureLookupSupplier lookupSupplier) 在特定的MethodHandles.Lookup
查找对象的上下文中执行操作。
-
Method Details
-
asType
类似于MethodHandle.asType(MethodType)
,但它还会钩住所有可用的GuardingTypeConverterFactory
实现产生的方法句柄,从而提供对参数进行特定于语言的类型强制转换。它将应用于所有原始到原始、包装器到原始、原始到包装器的转换,以及所有向上转型。对于所有其他转换,它将插入由MethodHandles.filterArguments(MethodHandle, int, MethodHandle...)
提供的复合过滤器。- 参数:
-
handle
- 目标方法句柄 -
fromType
- 源参数的类型 - 返回:
-
一个方法句柄,它是
MethodHandle.asType(MethodType)
、MethodHandles.filterArguments(MethodHandle, int, MethodHandle...)
和MethodHandles.filterReturnValue(MethodHandle, MethodHandle)
的合适组合,其中GuardingTypeConverterFactory
产生的类型转换器作为过滤器。
-
asTypeLosslessReturn
类似于asType(MethodHandle, MethodType)
,但它会特殊处理返回值类型转换。仅当可以使用既不失精度也不失量级的转换进行返回类型的方法句柄转换时,才会进行转换,否则将保持不变。这些是应由各个特定于语言的链接器执行的唯一返回值转换,动态链接器的预链接转换器
应根据调用点所在的语言运行时的特定方式实现处理潜在有损返回类型转换的策略。- 参数:
-
handle
- 目标方法句柄 -
fromType
- 源参数的类型 - 返回:
-
一个方法句柄,它是
MethodHandle.asType(MethodType)
和MethodHandles.filterArguments(MethodHandle, int, MethodHandle...)
的合适组合,其中GuardingTypeConverterFactory
产生的类型转换器作为过滤器。
-
getTypeConverter
给定源类型和目标类型,返回一个在它们之间进行转换的方法句柄。永远不会返回 null;在最坏的情况下,它将返回一个身份转换(在运行时可能对某些值失败)。您很少需要直接使用此方法,应大多依赖于asType(MethodHandle, MethodType)
。当您需要在处理链接请求的上下文之外重用现有类型转换机制时,才需要使用此方法。- 参数:
-
sourceType
- 要转换的类型 -
targetType
- 要转换为的类型 - 返回:
- 执行转换的方法句柄。
-
canConvert
如果请求的类型之间可能存在转换(自动 JVM 转换或任何可用的GuardingTypeConverterFactory
提供的转换),则返回 true;如果请求的类型之间绝对不存在转换,则返回 false。请注意,返回 true 不保证转换将对所有值成功(特别是如果“从”或“到”类型足够通用),但返回 false 则保证它将失败。- 参数:
-
from
- 转换的源类型 -
to
- 转换的目标类型 - 返回:
- 如果可能存在转换,则返回 true;如果不可能存在转换,则返回 false。
-
getGuardedInvocation
创建一个受保护的调用,委托给公开此链接器服务对象的DynamicLinker
。然后,动态链接器将自己将链接委托给其管理的所有GuardingDynamicLinker
,包括可能是此链接器的一个,如果没有链接器更早响应,则要注意可能会出现无限递归。通常,您将设计链接请求,以使其与您当前尝试链接的请求不同。- 参数:
-
linkRequest
- 链接调用的请求 - 返回:
- 由顶级动态链接器管理的一些保护动态链接器链接的调用。如果没有可用的链接器能够链接调用,则可能为 null。您通常将使用返回的调用的元素来组合自己的调用。
- 抛出:
-
Exception
- 如果顶级链接器抛出异常
-
compareConversion
ConversionComparator.Comparison compareConversion(Class<?> sourceType, Class<?> targetType1, Class<?> targetType2) 确定从源类型到两个目标类型的两种类型转换中哪一种更优先。这用于动态重载方法解析。如果源类型可以通过方法调用转换转换为恰好一个目标类型,则选择该目标类型,否则将查阅可用的ConversionComparator
。- 参数:
-
sourceType
- 源类型 -
targetType1
- 一个潜在的目标类型 -
targetType2
- 另一个潜在的目标类型 - 返回:
- 一个比较常量,确定哪个目标类型(如果有)更适合进行转换。
-
filterInternalObjects
修改方法句柄,以便任何可能接收内部语言运行时对象的参数都会添加一个过滤器,防止它们逃逸,可能通过包装它们。它还可能为返回值添加一个解包过滤器。基本上,使用由DynamicLinkerFactory.setInternalObjectsFilter(MethodHandleTransformer)
配置的转换器来转换方法句柄。- 参数:
-
target
- 目标方法句柄 - 返回:
- 一个方法句柄,其参数和/或返回类型可能经过包装和解包的过滤。
-
getWithLookup
在特定MethodHandles.Lookup
查找对象的上下文中执行操作。通常,LinkerServices
上的方法作为链接机制的一部分被调用,此时Dynalink在内部维护一个每个线程的当前查找(属于正在链接的调用点描述符的查找)。如果需要生成与查找相关的转换器,任何涉及链接的GuardingTypeConverterFactory
都可以检索此查找。但是,当实现调用时分发方案、在运行时调用转换等情况下,链接服务的方法也可以在链接过程之外被调用。如果在这种情况下需要使用任何类型转换器,并且它需要一个查找,通常只会得到MethodHandles.publicLookup()
,因为线程没有参与链接操作。如果有一种有意义地将操作与某个调用类的上下文关联起来的方法,请考虑在此方法的调用中执行它,并传递该类的完整查找,因为它将在操作的持续时间内将该查找与当前线程关联起来。请注意,由于您正在传递一个SecureLookupSupplier
,任何调用的类型转换器工厂仍然需要持有必要的运行时权限,以便在需要时获取查找。- 类型参数:
-
T
- 由传入供应商提供的返回值的类型。 - 参数:
-
operation
- 在指定查找的上下文中执行的操作。 -
lookupSupplier
- 安全的查找供应商 - 返回值:
- 操作的返回值
- 抛出:
-
NullPointerException
- 如果操作或lookupSupplier为null。 - 参见:
-