java.lang.Object
java.lang.runtime.SwitchBootstraps
用于链接实现
switch
语句选择功能的invokedynamic
调用站点的Bootstrap方法。引导程序接受额外的静态参数,对应于switch
的case
标签,从[0..N)
隐式按顺序编号。
- 自从:
- 21
-
Method Summary
Modifier and TypeMethodDescriptionstatic CallSite
enumSwitch
(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 用于链接实现枚举类型目标的switch
的invokedynamic
调用站点的Bootstrap方法。static CallSite
typeSwitch
(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 用于链接实现引用类型目标的switch
的invokedynamic
调用站点的Bootstrap方法。
-
Method Details
-
typeSwitch
public static CallSite typeSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 用于链接实现引用类型目标的switch
的invokedynamic
调用站点的Bootstrap方法。静态参数是一个String
或Integer
或Class
或EnumDesc
类型的case标签数组,必须非空。返回的
CallSite
方法句柄的类型将具有返回类型int
。它有两个参数:第一个参数将是一个Object
实例(target
),第二个将是int
(restart
)。如果
target
为null
,则调用站点的方法返回-1。如果
target
不为null
,则调用站点的方法返回从restart
索引开始匹配以下条件的labels
数组中第一个元素的索引:- 元素是可从目标类分配的
Class
类型;或 - 元素是
String
或Integer
类型且等于目标; - 元素是
EnumDesc
类型,描述一个等于目标的常量。
如果
labels
数组中没有任何元素与目标匹配,则调用站点的方法返回labels
数组的长度。restart
索引的值必须在0
(包括)和labels
数组的长度(包括)之间,否则将抛出IndexOutOfBoundsException
异常。- 参数:
-
lookup
- 表示调用者的可访问权限的查找上下文。在与invokedynamic
一起使用时,VM会自动堆叠此上下文。 -
invocationName
- 未使用 -
invocationType
-CallSite
的调用类型,具有两个参数,一个引用类型,一个int
,以及int
作为返回类型。 -
labels
- case标签 -String
和Integer
常量以及Class
和EnumDesc
实例,任意组合 - 返回:
-
返回第一个匹配元素的
CallSite
如上所述 - 抛出:
-
NullPointerException
- 如果任何参数为null
-
IllegalArgumentException
- 如果标签数组中的任何元素为null,如果调用类型不是第一个参数为引用类型,第二个参数为int
且返回类型为int
的方法类型,或者如果labels
包含不是目标枚举类型的String
、Integer
、Class
或EnumDesc
类型的元素。 - 参见Java虚拟机规范:
-
4.4.6 CONSTANT_NameAndType_info结构
4.4.10 CONSTANT_Dynamic_info和CONSTANT_InvokeDynamic_info结构
- 元素是可从目标类分配的
-
enumSwitch
public static CallSite enumSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 用于链接实现枚举类型目标的switch
的invokedynamic
调用站点的Bootstrap方法。静态参数用于编码与switch结构相关的case标签,其中每个标签可以以两种方式编码:- 作为
String
值,表示与标签关联的枚举常量的名称 - 作为
Class
值,表示与类型测试模式相关的枚举类型
返回的
CallSite
方法句柄将具有返回类型int
,接受两个参数:第一个参数将是一个Enum
实例(target
),第二个将是int
(restart
)。如果
target
为null
,则调用站点的方法返回-1。如果
target
不为null
,则调用站点的方法返回从restart
索引开始匹配以下条件的labels
数组中第一个元素的索引:- 元素是可从目标类分配的
Class
类型;或 - 元素是
String
类型且等于目标枚举常量的Enum.name()
。
如果
labels
数组中没有任何元素与目标匹配,则调用站点的方法返回labels
数组的长度。restart
索引的值必须在0
(包括)和labels
数组的长度(包括)之间,否则将抛出IndexOutOfBoundsException
异常。- 参数:
-
lookup
- 表示调用者的可访问权限的查找上下文。在与invokedynamic
一起使用时,VM会自动堆叠此上下文。 -
invocationName
- 未使用 -
invocationType
-CallSite
的调用类型,具有两个参数,一个枚举类型,一个int
,以及int
作为返回类型。 -
labels
- case标签 -String
常量和Class
实例,任意组合 - 返回:
-
返回第一个匹配元素的
CallSite
如上所述 - 抛出:
-
NullPointerException
- 如果任何参数为null
-
IllegalArgumentException
- 如果标签数组中的任何元素为null,如果调用类型不是第一个参数类型为枚举类型,第二个参数为int
且返回类型为int
的方法类型,或者如果labels
包含不是目标枚举类型的String
或Class
类型的元素。 - 参见Java虚拟机规范:
-
4.4.6 CONSTANT_NameAndType_info结构
4.4.10 CONSTANT_Dynamic_info和CONSTANT_InvokeDynamic_info结构
- 作为
-