模块 java.base

类 MethodHandleProxies

java.lang.Object
java.lang.invoke.MethodHandleProxies

public class MethodHandleProxies extends Object
此类专门由静态方法组成,这些静态方法有助于使方法句柄适应其他 JVM 类型,例如接口。
自从:
1.7
  • 方法详情

    • asInterfaceInstance

      public static <T> T asInterfaceInstance(Class <T> intfc, MethodHandle  target)
      生成给定的单一方法接口的实例,该接口将其调用重定向到给定的方法句柄。

      单方法接口是声明唯一命名方法的接口。在确定单一方法接口的唯一命名方法时,公共 Object 方法(toStringequalshashCode)与任何默认(非抽象)方法一样被忽略。例如,Comparator 是一个单方法接口,尽管它重新声明了 Object.equals 方法并且还声明了默认方法,例如 Comparator.reverse

      该接口必须是公共的,而不是 密封 。不执行额外的访问检查。

      所需类型的结果实例将通过在传入参数上调用给定目标并返回或抛出目标返回或抛出的任何内容来响应对该类型的唯一命名方法的调用。调用就像 target.invoke 一样。在创建实例之前将检查目标的类型,就像通过调用 asType 一样,这可能会导致 WrongMethodTypeException

      允许使用不同的类型描述符多次声明唯一命名的方法。 (例如,它可以被重载,或者可以拥有桥接方法。)所有这些声明都直接连接到目标方法句柄。 asType 为每个单独的声明调整了参数和返回类型。

      包装器实例将实现请求的接口及其超类型,但不会实现其他单一方法接口。这意味着该实例不会意外通过任何未请求类型的 instanceof 测试。

      Implementation Note: 因此,每个实例都必须实现唯一的单一方法接口。实现可能不会以 AWTEventMulticaster 的风格将多个单一方法接口捆绑到单个实现类中。

      方法句柄可能会抛出一个 undeclared exception ,这意味着任何未被请求类型的单个抽象方法声明的已检查异常(或其他已检查可抛出)。如果发生这种情况,throwable 将被包装在 UndeclaredThrowableException 的实例中并以该包装形式抛出。

      Integer.valueOf 一样,asInterfaceInstance 是一种工厂方法,其结果由其行为定义。不保证每次调用都返回一个新实例。

      由于 桥梁方法 和其他极端情况的可能性,接口也可能有几个同名但具有不同描述符(返回和参数类型)的抽象方法。在这种情况下,所有方法都绑定到一个给定的目标。类型检查和有效的 asType 转换应用于每个方法类型描述符,所有抽象方法都绑定到共同的目标。除了此类型检查之外,不会进行进一步检查以确定抽象方法是否以任何方式相关。

      此 API 的未来版本可能会接受其他类型,例如具有单个抽象方法的抽象类。此 API 的未来版本还可能为包装器实例配备一个或多个额外的公共“标记”接口。

      如果安装了安全管理器,则此方法对调用者敏感。在通过返回的包装器调用目标方法句柄期间,包装器的原始创建者(调用者)将对安全管理器请求的上下文检查可见。

      类型参数:
      T - 包装器的所需类型,单一方法接口
      参数:
      intfc - 代表 T 的类对象
      target - 从包装器调用的方法句柄
      返回:
      给定目标的正确类型包装器
      抛出:
      NullPointerException - 如果任一参数为空
      IllegalArgumentException - 如果 intfc 不是此方法的有效参数
      WrongMethodTypeException - 如果目标无法转换为请求接口所需的类型
    • isWrapperInstance

      public static boolean isWrapperInstance(Object  x)
      确定给定对象是否是通过调用 asInterfaceInstance 生成的。
      参数:
      x - 任何参考
      返回:
      如果引用不为 null 且指向由 asInterfaceInstance 生成的对象,则为真
    • wrapperInstanceTarget

      public static MethodHandle  wrapperInstanceTarget(Object  x)
      生成或恢复目标方法句柄,该句柄在行为上等效于此包装器实例的唯一方法。对象 x 必须是通过调用 asInterfaceInstance 生成的。此要求可以通过 isWrapperInstance 进行测试。
      参数:
      x - 任何参考
      返回:
      实现唯一方法的方法句柄
      抛出:
      IllegalArgumentException - 如果引用 x 不是包装器实例
    • wrapperInstanceType

      public static Class <?> wrapperInstanceType(Object  x)
      恢复为其创建此包装器实例的唯一单一方法接口类型。对象 x 必须是通过调用 asInterfaceInstance 生成的。此要求可以通过 isWrapperInstance 进行测试。
      参数:
      x - 任何参考
      返回:
      为其创建包装器的单一方法接口类型
      抛出:
      IllegalArgumentException - 如果引用 x 不是包装器实例