- java.lang.Object
-
- java.lang.invoke.MethodHandleProxies
-
public class MethodHandleProxies extends Object
此类仅由静态方法组成,可帮助将方法句柄修改为其他JVM类型(如接口)。- 从以下版本开始:
- 1.7
-
-
方法摘要
所有方法 静态方法 具体的方法 Modifier and Type 方法 描述 static <T> T
asInterfaceInstance(Class<T> intfc, MethodHandle target)
生成给定的单一方法接口的实例,将其调用重定向到给定的方法句柄。static boolean
isWrapperInstance(Object x)
确定给定对象是否通过调用asInterfaceInstance
生成 。static MethodHandle
wrapperInstanceTarget(Object x)
产生或恢复目标方法句柄,其行为上等同于此包装器实例的唯一方法。static Class<?>
wrapperInstanceType(Object x)
恢复创建此包装器实例的唯一的单一方法接口类型。
-
-
-
方法详细信息
-
asInterfaceInstance
public static <T> T asInterfaceInstance(Class<T> intfc, MethodHandle target)
生成给定的单一方法接口的实例,将其调用重定向到给定的方法句柄。单一方法接口是一个声明唯一命名方法的接口。 当确定单方法接口的唯一命名的方法,所述公共
Object
方法(toString
,equals
,hashCode
)被忽略。 例如,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
- 任何参考 - 结果
- 实现唯一方法的方法句柄
- 异常
-
IllegalArgumentException
- 如果引用x不是包装实例
-
wrapperInstanceType
public static Class<?> wrapperInstanceType(Object x)
- 参数
-
x
- 任何参考 - 结果
- 创建包装器的单一方法接口类型
- 异常
-
IllegalArgumentException
- if the reference x is not to a wrapper instance
-
-