模块 jdk.dynalink

接口 LinkerServices


public interface LinkerServices
由拥有它们的 DynamicLinker 提供给 GuardingDynamicLinker 实例的服务接口。
  • 方法详情

    • 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 生成的类型转换器的合适组合作为过滤器。
    • 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 Exception
      创建一个受保护的调用,委托回公开此链接器服务对象的 DynamicLinker 。如果没有链接器更早响应,动态链接器将自己将链接委托给其所有托管的 GuardingDynamicLinker s,可能包括这个链接器,因此请注意无限递归。您通常会制作链接请求,使其与您当前尝试链接的请求不同。
      参数:
      linkRequest - 链接调用的请求
      返回:
      由顶级动态链接器管理的一些保护动态链接器链接的受保护调用。如果没有可用的链接器能够链接调用,则可以为 null。您通常会使用返回的调用的元素来编写您自己的调用。
      抛出:
      Exception - 以防顶级链接器抛出异常
    • compareConversion

      ConversionComparator.Comparison  compareConversion(Class <?> sourceType, Class <?> targetType1, Class <?> 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 为空。
      参见: