public class LambdaMetafactory extends Object
方法方便简单的“对象”,实现由一个或多个接口,一个代表团提供MethodHandle
创作,可能在式改编和部分论据评价。这些方法通常用于invokedynamic
调用网站的引导方法,支持和java编程语言的方法引用表达式特征的lambda表达式。
间接访问指定的MethodHandle
收益提供了通过三个阶段的行为:
CallSite
的目标可以用创造合适的函数对象。联动可能涉及动态加载实现目标接口的新类。的CallSite
可以被认为是一个“工厂”的函数对象,这些联动的方法被称为“metafactories”。CallSite
的目标时,通常是通过一个invokedynamic
电话网站,产生一个函数对象。这可能会发生很多次的工厂CallSite
。捕捉可能涉及一个新的函数对象的分配,也可以返回一个现有的函数对象。行为MethodHandle
可能有额外的参数超出指定的接口方法;这些被称为捕获的参数,它必须提供给CallSite
目标参数,这可能是早期绑定的行为MethodHandle
。捕获的参数的数量和它们的类型在联动过程中确定的。MethodHandle
引用的方法是捕获的参数和设置在调用任何额外的参数调用,如MethodHandle.invoke(Object...)
。它有时是有用的,以限制所允许的输入或结果的集合。例如,当通用的接口Predicate<T>
参数作为Predicate<String>
,输入必须是一个String
,即使实施方法允许任何Object
。在连接时,一个额外的MethodType
参数描述了“实例化”方法的类型;在调用,参数和最终的结果是对这个MethodType
检查。
这个类提供了联动的方法有两种形式:标准版(metafactory(MethodHandles.Lookup, String, MethodType, MethodType, MethodHandle, MethodType)
)使用优化的协议,而另一个版本altMetafactory(MethodHandles.Lookup, String, MethodType, Object...)
)。备用版本是标准版本的一个推广,通过标志和额外的参数对生成的函数对象的行为提供额外的控制。备用版本添加了管理功能对象的下列属性的能力:
FLAG_BRIDGES
表明一个额外的MethodType
s将提供,每一种都会造成功能的对象实现。这些方法将共享相同的名称和实例化的类型。FLAG_MARKERS
表明一个额外的接口将提供,都应引起的函数对象实现。FLAG_SERIALIZABLE
可以用来表示函数的对象应该是可序列化的。序列化的函数对象将使用,作为他们的序列化形式,该类SerializedLambda
实例,这需要额外的援助从捕获类(类的MethodHandles.Lookup
参数caller
描述);看到SerializedLambda
详情。假设连接参数如下:
invokedType
(描述CallSite
签名)具有类型参数K(D1,DK)和返回类型的路;samMethodType
(描述实现方法型)有n个参数的类型(U1 ..联合国)和返回类型,如;implMethod
(的MethodHandle
提供实施M参数类型(A1,AM)和返回类型RA(如果方法描述了一个实例方法,该方法处理方法类型已经包括对应于接收额外的第一个参数);instantiatedMethodType
(允许限制调用)有n个参数的类型(T1,TN)和返回类型的。然后下面的链接不变量必须保持:
implMethod
是一个直接的方法处理samMethodType
和instantiatedMethodType
有相同数量的N,和我= 1,N、Ti和UI都是同一类型,或Ti和UI都是引用类型和Ti是UI的一个亚型此外,在捕获的时间,如果implMethod
对应一个实例方法,还有任何捕捉参数(K > 0
),然后第一个捕获参数(对应的接收机)必须是非空。
A型Q被认为是适应如下:
Q | S | Link-time checks | Invocation-time checks |
---|---|---|---|
Primitive | Primitive | Q can be converted to S via a primitive widening conversion | None |
Primitive | Reference | S is a supertype of the Wrapper(Q) | Cast from Wrapper(Q) to S |
Reference | Primitive | for parameter types: Q is a primitive wrapper and Primitive(Q) can be widened to S for return types: If Q is a primitive wrapper, check that Primitive(Q) can be widened to S |
If Q is not a primitive wrapper, cast Q to the base Wrapper(S); for example Number for numeric types |
Reference | Reference | for parameter types: S is a supertype of Q for return types: none |
Cast from Q to S |
实现方法的参数列表和接口方法的参数列表可能会在几个方面有所不同。实施方法可能有额外的参数以适应由lambda表达式捕获的争论;也有可能是从允许改编的争论而产生的差异,如铸造,装箱,拆箱,和原始的扩大。(varargs适应是不是由metafactories;处理这些预期被呼叫者。处理)
打电话的网站有两个invokedynamic参数列表:静态和动态参数列表中的参数列表。静态参数列表存储在常量池中;在捕获时,动态参数将被推到操作数堆栈上。Bootstrap方法获得了整个静态参数列表(在这种情况下,包括信息描述的实现方法,目标接口和对象的接口方法(S)),以及一个方法签名描述数和静态类型(而不是价值)和invokedynamic网站静态返回类型的动态参数。
Modifier and Type | Field and Description |
---|---|
static int |
FLAG_BRIDGES
交替metafactories指示lambda对象标志需要额外的桥方法
|
static int |
FLAG_MARKERS
交替metafactories指示lambda对象实现Serializable接口之外的其他标志旗
|
static int |
FLAG_SERIALIZABLE
交替metafactories指示lambda对象必须是可序列化的旗帜
|
Constructor and Description |
---|
LambdaMetafactory() |
Modifier and Type | Method and Description |
---|---|
static CallSite |
altMetafactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, Object... args)
方便简单的“对象”,实现由一个或多个接口,一个代表团提供
MethodHandle 创作,经过适当的类型的适应和部分论据评价。
|
static CallSite |
metafactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, MethodType samMethodType, MethodHandle implMethod, MethodType instantiatedMethodType)
方便简单的“对象”,实现由一个或多个接口,一个代表团提供
MethodHandle 创作,经过适当的类型的适应和部分论据评价。
|
public static final int FLAG_SERIALIZABLE
public static final int FLAG_MARKERS
public static final int FLAG_BRIDGES
public static CallSite metafactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, MethodType samMethodType, MethodHandle implMethod, MethodType instantiatedMethodType) throws LambdaConversionException
MethodHandle
创作,经过适当的类型的适应和部分论据评价。通常用于
invokedynamic
调用站点的Bootstrap方法,支持和java编程语言的方法引用表达式特征的lambda表达式。
这是标准的,流线型的metafactory;提供额外的灵活性的altMetafactory(MethodHandles.Lookup, String, MethodType, Object...)
。此方法的行为的一般性描述提供above
。
在CallSite
目标返回调用该方法,所得到的函数对象是一个类实现了接口的invokedType
返回类型声明一个命名实例,通过invokedName
由samMethodType
签名命名方法。它也可以覆盖从Object
附加的方法。
caller
代表与呼叫者访问权限查找上下文。当使用
invokedynamic
,这是由虚拟机自动地堆叠。
invokedName
-名称的方法来实现。当使用
invokedynamic
,这是由
InvokeDynamic
结构
NameAndType
提供堆叠自动的VM。
invokedType
的
CallSite
预期的签名。参数类型表示捕获变量的类型;返回类型是实现的接口。当使用
invokedynamic
,这是由
InvokeDynamic
结构
NameAndType
提供堆叠自动的VM。在执行方法是一个实例方法的事件中,该签名有任何参数,调用签名中的第一个参数必须对应于接收机。
samMethodType
签名和方法的返回类型是由函数对象实现。
implMethod
-直接法处理描述的实现方法,应称为(与参数类型、返回类型和参数值,捕获的参数调用合适的适应)在调用时。
instantiatedMethodType
-签名和返回类型必须在调用时执行动态。这可能是
samMethodType
相同,或可能是一个专业化的。
invokedType
命名实例
LambdaConversionException
-如果有任何的联系
above
不变量描述违反
public static CallSite altMetafactory(MethodHandles.Lookup caller, String invokedName, MethodType invokedType, Object... args) throws LambdaConversionException
MethodHandle
创作,经过适当的类型的适应和部分论据评价。通常用于
invokedynamic
调用站点的Bootstrap方法,支持和java编程语言的方法引用表达式特征的lambda表达式。
这是一般的,更灵活的metafactory;精简版是由altMetafactory(MethodHandles.Lookup, String, MethodType, Object...)
。此方法的行为的一般性描述提供above
。
此方法的参数列表包括三个固定参数,对应于参数的自动堆放在invokedynamic
调用Bootstrap方法的虚拟机,和一个Object[]
参数包含额外的参数。此方法的声明的参数列表是:
CallSite altMetafactory(MethodHandles.Lookup caller,
String invokedName,
MethodType invokedType,
Object... args)
但它的行为就像参数列表如下:
CallSite altMetafactory(MethodHandles.Lookup caller,
String invokedName,
MethodType invokedType,
MethodType samMethodType,
MethodHandle implMethod,
MethodType instantiatedMethodType,
int flags,
int markerInterfaceCount, // IF flags has MARKERS set
Class... markerInterfaces, // IF flags has MARKERS set
int bridgeCount, // IF flags has BRIDGES set
MethodType... bridges // IF flags has BRIDGES set
)
这出现在参数列表metafactory(MethodHandles.Lookup, String, MethodType, MethodType, MethodHandle, MethodType)
参数具有相同的规格,方法。额外的参数解释如下:
flags
显示额外的选项;这是一个按位或所需的旗帜。定义的标志FLAG_BRIDGES
,FLAG_MARKERS
,和FLAG_SERIALIZABLE
。markerInterfaceCount
是额外的接口函数对象应该实现的数量,并存在当且仅当FLAG_MARKERS
标志设置。markerInterfaces
是可变长度列附加的接口来实现的,其长度等于markerInterfaceCount
,并存在当且仅当FLAG_MARKERS
标志设置。bridgeCount
是额外的方法签名的函数对象应该实现的数量,并提出若FLAG_BRIDGES
标志设置。bridges
是可变长度列的附加方法签名来实现的,其长度等于bridgeCount
,并存在当且仅当FLAG_BRIDGES
标志设置。每一类命名为markerInterfaces
须Rd
相同的限制,对invokedType
返回类型,如above
。每个MethodType
命名为samMethodType
bridges
受到同样的限制,如above
。
当flag_serializable设置在flags
,函数对象将实施Serializable
,将会有一个writeReplace
方法返回一个适当的SerializedLambda
。的caller
类必须有一个适当的$deserializeLambda$
方法,如SerializedLambda
。
在CallSite
目标返回调用该方法,所得到的函数对象是一个类的实例具有以下特性:
invokedType
返回类型和接口的命名markerInterfaces
命名invokedName
名称和签名的签名samMethodType
和额外的bridges
给定Object
,可以实施相关的序列化方法。caller
代表与呼叫者访问权限查找上下文。当使用
invokedynamic
,这是由虚拟机自动地堆叠。
invokedName
-名称的方法来实现。当使用
invokedynamic
,这是由
InvokeDynamic
结构
NameAndType
提供堆叠自动的VM。
invokedType
的
CallSite
预期的签名。参数类型表示捕获变量的类型;返回类型是实现的接口。当使用
invokedynamic
,这是由
InvokeDynamic
结构
NameAndType
提供堆叠自动的VM。在执行方法是一个实例方法的事件中,该签名有任何参数,调用签名中的第一个参数必须对应于接收机。
args
含有所需的参数
samMethodType
,
implMethod
,
instantiatedMethodType
,
flags
一
Object[]
阵列,和任何可选参数,如
altMetafactory(MethodHandles.Lookup, String, MethodType, Object...)
以上}
invokedType
命名实例
LambdaConversionException
-如果有任何的联系
above
不变量描述违反
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.