public class MethodHandleProxies extends Object
Modifier and Type | Method and Description |
---|---|
static <T> T |
asInterfaceInstance(类<T> intfc, MethodHandle target)
生成给定的单一方法接口的实例,将其调用重定向到给定的方法句柄。
|
static boolean |
isWrapperInstance(Object x)
确定给定对象是否通过调用
asInterfaceInstance 生成 。
|
static MethodHandle |
wrapperInstanceTarget(Object x)
产生或恢复目标方法句柄,其行为上等同于此包装器实例的唯一方法。
|
static 类<?> |
wrapperInstanceType(Object x)
恢复创建此包装器实例的唯一的单一方法接口类型。
|
public static <T> T asInterfaceInstance(类<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
- 如果目标无法转换为请求的接口所需的类型
public static boolean isWrapperInstance(Object x)
asInterfaceInstance
生成 。
x
- 任何参考
asInterfaceInstance
生成的对象,
asInterfaceInstance
public static MethodHandle wrapperInstanceTarget(Object x)
x
- 任何参考
IllegalArgumentException
- 如果引用x不是包装实例
public static 类<?> wrapperInstanceType(Object x)
x
- 任何参考
IllegalArgumentException
- 如果引用x不是包装实例