模块 java.base

类 ConstantBootstraps

java.lang.Object
java.lang.invoke.ConstantBootstraps

public final class ConstantBootstraps extends Object
动态计算常量的引导方法。

此类中的引导程序方法将为任何 null 引用参数抛出 NullPointerException ,除非该参数被指定为未使用或被指定为接受 null 值。

自从:
11
  • 方法详情

    • nullConstant

      public static Object  nullConstant(MethodHandles.Lookup  lookup, String  name, Class <?> type)
      type 指定的引用类型返回一个 null 对象引用。
      参数:
      lookup - 未使用
      name - 未使用
      type - 引用类型
      返回:
      null
      抛出:
      IllegalArgumentException - 如果 type 不是引用类型
    • primitiveClass

      public static Class <?> primitiveClass(MethodHandles.Lookup  lookup, String  name, Class <?> type)
      返回原始类型的 Class 镜像,其类型描述符由 name 指定。
      参数:
      lookup - 未使用
      name - 所需原始类型的描述符 (JVMS 4.3)
      type - 所需的结果类型(必须是 Class.class
      返回:
      Class 镜子
      抛出:
      IllegalArgumentException - 如果名称不是基本类型的描述符或类型不是 Class.class
    • enumConstant

      public static <E extends Enum <E>> E enumConstant(MethodHandles.Lookup  lookup, String  name, Class <E> type)
      返回一个 enum 常量,其类型由 type 指定,名称由 name 指定。
      类型参数:
      E - 要为其返回常量值的枚举类型
      参数:
      lookup - 描述执行操作的类的查找上下文(通常由 JVM 堆叠)
      name - 要返回的常量的名称,它必须与指定类型的枚举常量完全匹配。
      type - Class 对象描述要为其返回常量的枚举类型
      返回:
      具有指定名称的指定枚举类型的枚举常量
      抛出:
      IllegalAccessError - 如果执行操作的类无法访问声明类或字段
      IllegalArgumentException - 如果指定的枚举类型没有具有指定名称的常量,或者指定的类对象不代表枚举类型
      参见:
    • getStaticFinal

      public static Object  getStaticFinal(MethodHandles.Lookup  lookup, String  name, Class <?> type, Class <?> declaringClass)
      返回静态最终字段的值。
      参数:
      lookup - 描述执行操作的类的查找上下文(通常由 JVM 堆叠)
      name - 字段名称
      type - 字段类型
      declaringClass - 声明字段的类
      返回:
      字段的值
      抛出:
      IllegalAccessError - 如果执行操作的类无法访问声明类或字段
      NoSuchFieldError - 如果指定字段不存在
      IncompatibleClassChangeError - 如果指定字段不是 final
    • getStaticFinal

      public static Object  getStaticFinal(MethodHandles.Lookup  lookup, String  name, Class <?> type)
      返回在类中声明的与字段类型相同的静态最终字段的值(或者,对于原始值字段,在包装类中声明。)这是 getStaticFinal(MethodHandles.Lookup, String, Class, Class) 的简化形式,用于类声明的情况区分自身的常量实例。
      参数:
      lookup - 描述执行操作的类的查找上下文(通常由 JVM 堆叠)
      name - 字段名称
      type - 字段类型
      返回:
      字段的值
      抛出:
      IllegalAccessError - 如果执行操作的类无法访问声明类或字段
      NoSuchFieldError - 如果指定字段不存在
      IncompatibleClassChangeError - 如果指定字段不是 final
      参见:
    • invoke

      public static Object  invoke(MethodHandles.Lookup  lookup, String  name, Class <?> type, MethodHandle  handle, Object ... args) throws Throwable
      返回使用提供的参数调用方法句柄的结果。

      此方法的行为就好像要调用的方法句柄是通过 MethodHandle.asType(java.lang.invoke.MethodType) 调整给定方法句柄以将返回类型调整为所需类型的结果。

      参数:
      lookup - 未使用
      name - 未使用
      type - 要返回的值的期望类型,必须与方法句柄的返回类型兼容
      handle - 要调用的方法句柄
      args - 传递给方法句柄的参数,就像 MethodHandle.invokeWithArguments(java.lang.Object...) 一样。每个参数都可以是 null
      返回:
      调用方法句柄的结果
      抛出:
      WrongMethodTypeException - 如果句柄的方法类型无法调整为采用给定数量的参数,或者如果句柄的返回类型无法调整为所需的类型
      ClassCastException - 如果调用句柄产生的参数或结果无法通过引用转换进行转换
      Throwable - 方法句柄调用抛出的任何内容
    • fieldVarHandle

      public static VarHandle  fieldVarHandle(MethodHandles.Lookup  lookup, String  name, Class <VarHandle > type, Class <?> declaringClass, Class <?> fieldType)
      为实例字段查找 VarHandle
      参数:
      lookup - 描述执行操作的类的查找上下文(通常由 JVM 堆叠)
      name - 字段名称
      type - 所需的结果类型(必须是 Class<VarHandle>
      declaringClass - 声明字段的类
      fieldType - 字段类型
      返回:
      VarHandle
      抛出:
      IllegalAccessError - 如果执行操作的类无法访问声明类或字段
      NoSuchFieldError - 如果指定字段不存在
      IllegalArgumentException - 如果类型不是 VarHandle
    • staticFieldVarHandle

      public static VarHandle  staticFieldVarHandle(MethodHandles.Lookup  lookup, String  name, Class <VarHandle > type, Class <?> declaringClass, Class <?> fieldType)
      为静态字段查找 VarHandle
      参数:
      lookup - 描述执行操作的类的查找上下文(通常由 JVM 堆叠)
      name - 字段名称
      type - 所需的结果类型(必须是 Class<VarHandle>
      declaringClass - 声明字段的类
      fieldType - 字段类型
      返回:
      VarHandle
      抛出:
      IllegalAccessError - 如果执行操作的类无法访问声明类或字段
      NoSuchFieldError - 如果指定字段不存在
      IllegalArgumentException - 如果类型不是 VarHandle
    • arrayVarHandle

      public static VarHandle  arrayVarHandle(MethodHandles.Lookup  lookup, String  name, Class <VarHandle > type, Class <?> arrayClass)
      查找数组类型的 VarHandle
      参数:
      lookup - 描述执行操作的类的查找上下文(通常由 JVM 堆叠)
      name - 未使用
      type - 所需的结果类型(必须是 Class<VarHandle>
      arrayClass - 数组的类型
      返回:
      VarHandle
      抛出:
      IllegalAccessError - 如果执行操作的类无法访问数组的组件类型
      IllegalArgumentException - 如果类型不是 VarHandle
    • explicitCast

      public static Object  explicitCast(MethodHandles.Lookup  lookup, String  name, Class <?> dstType, Object  value) throws ClassCastException
      应用从源类型到目标类型的转换。

      给定目标类型 dstType 和输入值 value ,将发生以下情况之一:

      • 如果 dstTypevoid.class,则抛出 ClassCastException
      • 如果 dstTypeObject.class ,则 value 按原样返回。

      否则,以下转换之一将应用于 value

      1. 如果 dstType 是引用类型,则将引用强制转换应用于 value 就像调用 dstType.cast(value) 一样。
      2. 如果 dstType 是原始类型,那么,如果 value 的运行时类型是原始包装类型(例如 Integer ),则应用 Java 拆箱转换 5.1.8 然后是 Java 转换转换 5.5 直接转换为 dstType ,或者,如果 dstTypebooleanint ,然后根据最低有效位是 1 还是 0 分别转换为 truefalse 。如果 value 的运行时类型不是原始包装类型,则抛出 ClassCastException

      结果与使用以下代码时相同:

      
       MethodHandle id = MethodHandles.identity(dstType);
       MethodType mt = MethodType.methodType(dstType, Object.class);
       MethodHandle conv = MethodHandles.explicitCastArguments(id, mt);
       return conv.invoke(value);
        
      参数:
      lookup - 未使用
      name - 未使用
      dstType - 转换的目标类型
      value - 要转换的值
      返回:
      转换后的值
      抛出:
      ClassCastException - 当 dstTypevoid 时,当每 (1) 的转换失败时,或者当 dstType 是原始类型并且 value 的运行时类型不是原始包装类型(例如 Integer
      自从:
      15