Module java.base

Class SwitchBootstraps

java.lang.Object
java.lang.runtime.SwitchBootstraps

public class SwitchBootstraps extends Object
用于链接实现switch语句选择功能的invokedynamic调用站点的Bootstrap方法。引导程序接受额外的静态参数,对应于switchcase标签,从[0..N)隐式按顺序编号。
自从:
21
  • Method Details

    • typeSwitch

      public static CallSite typeSwitch(MethodHandles.Lookup lookup, String invocationName, MethodType invocationType, Object... labels)
      用于链接实现引用类型目标的switchinvokedynamic调用站点的Bootstrap方法。静态参数是一个StringIntegerClassEnumDesc类型的case标签数组,必须非空。

      返回的CallSite方法句柄的类型将具有返回类型int。它有两个参数:第一个参数将是一个Object实例(target),第二个将是intrestart)。

      如果targetnull,则调用站点的方法返回-1。

      如果target不为null,则调用站点的方法返回从restart索引开始匹配以下条件的labels数组中第一个元素的索引:

      • 元素是可从目标类分配的Class类型;或
      • 元素是StringInteger类型且等于目标;
      • 元素是EnumDesc类型,描述一个等于目标的常量。

      如果labels数组中没有任何元素与目标匹配,则调用站点的方法返回labels数组的长度。

      restart索引的值必须在0(包括)和labels数组的长度(包括)之间,否则将抛出IndexOutOfBoundsException异常。

      参数:
      lookup - 表示调用者的可访问权限的查找上下文。在与invokedynamic一起使用时,VM会自动堆叠此上下文。
      invocationName - 未使用
      invocationType - CallSite的调用类型,具有两个参数,一个引用类型,一个int,以及int作为返回类型。
      labels - case标签 - StringInteger常量以及ClassEnumDesc实例,任意组合
      返回:
      返回第一个匹配元素的CallSite如上所述
      抛出:
      NullPointerException - 如果任何参数为null
      IllegalArgumentException - 如果标签数组中的任何元素为null,如果调用类型不是第一个参数为引用类型,第二个参数为int且返回类型为int的方法类型,或者如果labels包含不是目标枚举类型的StringIntegerClassEnumDesc类型的元素。
      参见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)
      用于链接实现枚举类型目标的switchinvokedynamic调用站点的Bootstrap方法。静态参数用于编码与switch结构相关的case标签,其中每个标签可以以两种方式编码:
      • 作为String值,表示与标签关联的枚举常量的名称
      • 作为Class值,表示与类型测试模式相关的枚举类型

      返回的CallSite方法句柄将具有返回类型int,接受两个参数:第一个参数将是一个Enum实例(target),第二个将是intrestart)。

      如果targetnull,则调用站点的方法返回-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包含不是目标枚举类型的StringClass类型的元素。
      参见Java虚拟机规范:
      4.4.6 CONSTANT_NameAndType_info结构
      4.4.10 CONSTANT_Dynamic_info和CONSTANT_InvokeDynamic_info结构