模块  java.base
软件包  java.lang.invoke

Class MethodHandleProxies


  • public class MethodHandleProxies
    extends Object
    此类仅包含静态方法,这些方法有助于将方法句柄调整为其他JVM类型,例如接口。
    从以下版本开始:
    1.7
    • 方法详细信息

      • asInterfaceInstance

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

        单方法接口是声明唯一命名方法的接口。 当确定单方法接口的唯一命名的方法,所述公共Object方法( toStringequalshashCode )被忽略。 例如, Comparator是单方法接口,即使它重新声明了Object.equals方法。

        界面必须是公共的。 不执行其他访问检查。

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

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

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

        实现注意:因此,每个实例都必须实现一个唯一的单方法接口。 实现可能不会将多个单方法接口捆绑到AWTEventMulticaster样式的单个实现类中。

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

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

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

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

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

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

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

        public static MethodHandle wrapperInstanceTarget​(Object x)
        生成或恢复目标方法句柄,该句柄在行为上等同于此包装器实例的唯一方法。 对象x必须已经由一个呼叫产生asInterfaceInstance 此要求可通过isWrapperInstance进行测试。
        参数
        x - 任何参考
        结果
        实现唯一方法的方法句柄
        异常
        IllegalArgumentException - 如果引用x不是包装器实例
      • wrapperInstanceType

        public static <?> wrapperInstanceType​(Object x)
        恢复为此包装器实例创建的唯一单方法接口类型。 对象x必须已经由一个呼叫产生asInterfaceInstance 此要求可通过isWrapperInstance进行测试。
        参数
        x - 任何参考
        结果
        为其创建包装器的单方法接口类型
        异常
        IllegalArgumentException - if the reference x is not to a wrapper instance