Module  java.base
软件包  java.lang.invoke

Class 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方法。

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

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

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

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

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

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

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

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

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

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

        参数类型
        T - 所需类型的包装器,单一方法接口
        参数
        intfc - 表示 T的类对象
        target - 从包装器调用的方法句柄
        结果
        给定目标的正确类型的包装器
        异常
        NullPointerException - 如果任一参数为空
        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 Class<?> wrapperInstanceType​(Object x)
        恢复创建此包装器实例的唯一的单一方法接口类型。 对象x必须通过调用asInterfaceInstance生成 此要求可通过isWrapperInstance进行测试。
        参数
        x - 任何参考
        结果
        创建包装器的单一方法接口类型
        异常
        IllegalArgumentException - if the reference x is not to a wrapper instance