模块  jdk.dynalink
软件包  jdk.dynalink.linker

Interface GuardingTypeConverterFactory


  • public interface GuardingTypeConverterFactory
    可选的接口,可由GuardingDynamicLinker实现实现,以提供特定于语言的类型转换功能。 请注意,如果您实现此接口,您很可能也希望实现ConversionComparator接口,因为在没有优先处理这些转换的策略的情况下,您的其他语言特定转换将导致BeansLinker在尝试选择正确的重载时更加模糊链接到重载的Java方法。
    • 方法详细信息

      • convertToType

        GuardedInvocation convertToType​(<?> sourceType,
                                        <?> targetType,
                                        Supplier<MethodHandles.Lookup> lookupSupplier)
                                 throws 异常
        返回一个受保护的类型转换,它接收指定源类型的值并返回转换为指定目标类型的值。 值类型可以是基元或引用类型,包括接口,因此您甚至可以通过为它们生成适配器来提供转换器,以将语言的对象转换为Java接口和类。

        调用的类型是(sourceType)→targetType ,而防护的类型是(sourceType)→boolean 如果源类型特定于运行时和运行时,则允许您返回无条件调用(没有保护)。

        请注意,永远不会为method invocation conversions调用此方法,因为MethodHandle.asType(MethodType)可以自动应用这些方法 实现可以假设从不请求为这些转换生成转换器。 如果语言运行库需要自定义方法调用转换,则应改为set an autoconversion strategy in the dynamic linker factory

        Dynalink可以自行缓存一些返回的转换器,或者重复请求转换器工厂创建相同的转换。

        参数
        sourceType - 源类型
        targetType - 目标类型。
        lookupSupplier - 用于检索请求类型转换器的类的查找的供应商。 当请求转换器作为链接invokedynamic指令的一部分时,供应商将返回传递给bootstrap方法的查找,否则如果从LinkerServices.getWithLookup(Supplier, jdk.dynalink.SecureLookupSupplier)内调用该方法,它将委托给安全查找供应商。 在任何其他情况下,它将返回公共查找。 可能需要查找的典型情况是转换器动态创建Java适配器类(例如,将某些对象从动态语言转换为Java接口以实现互操作性)。 在通过的供应商上调用Supplier.get()方法将受到与SecureLookupSupplier.getLookup()相同的安全检查。 如果不需要,实现应避免检索查找,以避免花费AccessController.doPrivileged调用。
        结果
        一个受保护的调用,可以获取一个对象(如果它通过后卫)并返回另一个对象,该对象被强制转换为目标类型。 如果工厂确定它无法处理转换,它可以返回null。 如果工厂确定它始终可以处理转换,它可以返回无条件调用(其警戒为空)。
        异常
        异常 - 如果在创建转换器期间出错
        另请参见:
        LinkerServices.getWithLookup(Supplier, SecureLookupSupplier)