- 自 JDK 版本:
- 1.7
-
Method Summary
Modifier and TypeMethodDescriptionstatic <T> T
asInterfaceInstance
(Class<T> intfc, MethodHandle target) 生成给定单方法接口的实例,将其调用重定向到给定的方法句柄。static boolean
确定给定对象是否由调用asInterfaceInstance
生成。static MethodHandle
生成或恢复一个目标方法句柄,其行为等效于此包装器实例的唯一方法。static Class
<?> 恢复创建此包装器实例的唯一单方法接口类型。
-
Method Details
-
asInterfaceInstance
生成给定单方法接口的实例,将其调用重定向到给定的方法句柄。单方法接口是指声明了唯一命名方法的接口。在确定单方法接口的唯一命名方法时,将忽略公共的
Object
方法(toString
、equals
、hashCode
),以及任何默认(非抽象)方法。例如,Comparator
是一个单方法接口,即使它重新声明了Object.equals
方法,还声明了默认方法,如Comparator.reverse
。接口必须是公共的且不是 sealed。不执行额外的访问检查。
所需类型的结果实例将通过调用类型的唯一命名方法来响应传入参数上的给定目标的调用,并返回或抛出目标返回或抛出的内容。调用将类似于
target.invoke
。在创建实例之前将检查目标的类型,就像通过调用asType
一样,这可能导致WrongMethodTypeException
。允许唯一命名方法被多次声明,具有不同的类型描述符。(例如,它可以是重载的,或者可以拥有桥接方法。)所有这样的声明都直接连接到目标方法句柄。对于每个单独的声明,参数和返回类型将通过
asType
进行调整。包装器实例将实现请求的接口及其超类型,但不会实现其他单方法接口。这意味着该实例不会意外地通过任何未请求类型的
instanceof
测试。实现说明: 因此,每个实例必须实现一个唯一的单方法接口。实现不能像
AWTEventMulticaster
那样将多个单方法接口捆绑到单个实现类中。方法句柄可能会抛出一个未声明的异常,这意味着请求类型的单个抽象方法未声明的任何已检查异常(或其他已检查的可抛出对象)。如果发生这种情况,将在一个
UndeclaredThrowableException
实例中包装可抛出对象,并以该包装形式抛出。类似于
Integer.valueOf
,asInterfaceInstance
是一个工厂方法,其结果由其行为定义。不能保证每次调用都返回一个新实例。由于可能存在 桥接方法和其他边界情况,接口也可能具有几个具有相同名称但具有不同描述符(返回类型和参数类型)的抽象方法。在这种情况下,所有方法都与给定目标绑定在一起。对每个方法类型描述符应用类型检查和有效的
asType
转换,并将所有抽象方法共同绑定到目标上。除此类型检查外,不会进一步检查以确定抽象方法在任何方面是否相关。此 API 的未来版本可能接受其他类型,例如具有单个抽象方法的抽象类。此 API 的未来版本还可能为包装器实例配备一个或多个额外的公共“标记”接口。
如果安装了安全管理器,则此方法是调用者敏感的。在通过返回的包装器调用目标方法句柄期间,包装器的原始创建者(调用者)将对安全管理器请求的上下文检查可见。
- 类型参数:
-
T
- 包装器的期望类型,即单方法接口 - 参数:
-
intfc
- 表示T
的类对象 -
target
- 从包装器调用的方法句柄 - 返回:
- 适用于给定目标的正确类型的包装器
- 异常:
-
NullPointerException
- 如果任一参数为 null -
IllegalArgumentException
- 如果intfc
不是此方法的有效参数 -
WrongMethodTypeException
- 如果无法将目标转换为请求接口所需的类型
-
isWrapperInstance
确定给定对象是否由调用asInterfaceInstance
生成。- 参数:
-
x
- 任何引用 - 返回:
-
如果引用不为 null 并且指向由
asInterfaceInstance
生成的对象,则返回 true
-
wrapperInstanceTarget
- 参数:
-
x
- 任何引用 - 返回:
- 实现唯一方法的方法句柄
- 异常:
-
IllegalArgumentException
- 如果引用 x 不是包装器实例
-
wrapperInstanceType
- 参数:
-
x
- 任何引用 - 返回:
- 为其创建包装器的单方法接口类型
- 异常:
-
IllegalArgumentException
- 如果引用 x 不是包装器实例
-