java.lang.Object
java.lang.runtime.SwitchBootstraps
用于链接实现
switch语句选择功能的invokedynamic调用站点的Bootstrap方法。引导程序接受额外的静态参数,对应于switch的case标签,从[0..N)隐式按顺序编号。
- 自从:
- 21
-
Method Summary
Modifier and TypeMethodDescriptionstatic CallSiteenumSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels) 用于链接实现枚举类型目标的switch的invokedynamic调用站点的Bootstrap方法。static CallSitetypeSwitch(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结构
- 作为
-