Module jdk.dynalink

Interface GuardingTypeConverterFactory


public interface GuardingTypeConverterFactory
可选接口,可以由实现GuardingDynamicLinker的实现来提供特定于语言的类型转换功能。请注意,如果您实现了此接口,很可能还需要实现ConversionComparator接口,因为您的额外特定于语言的转换,如果没有优先考虑这些转换的策略,将会导致在尝试链接到重载的Java方法时,BeansLinker在选择正确的重载时会导致更多的歧义。
  • Method Details

    • convertToType

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

      调用的类型为(sourceType)→targetType,而保护的类型为(sourceType)→boolean。如果源类型特定于您的运行时且仅限于您的运行时,则可以返回无条件调用(没有保护)。

      请注意,此方法永远不会为方法调用转换调用,因为这些可以通过MethodHandle.asType(MethodType)自动应用。实现可以假定永远不会要求为这些转换生成转换器。如果语言运行时需要自定义方法调用转换,则应该在动态链接器工厂中设置自动转换策略

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

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