Module java.base
Package java.lang.invoke

Class ConstantBootstraps

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

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

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

自:
11
  • Method Details

    • 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)
      返回由name指定的基本类型的类型描述符的Class镜像。
      参数:
      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)
      返回由type指定的类型的枚举常量,名称由name指定。
      类型参数:
      E - 要返回常量值的枚举类型
      参数:
      lookup - 描述执行操作的类的查找上下文(通常由JVM堆栈)
      name - 要返回的常量的名称,必须与指定类型中的枚举常量完全匹配。
      type - 描述要返回常量的枚举类型的Class对象
      返回:
      具有指定名称的指定枚举类型的枚举常量
      抛出:
      IllegalAccessError - 如果声明类或字段对执行操作的类不可访问
      IllegalArgumentException - 如果指定的枚举类型没有具有指定名称的常量,或指定的类对象不表示枚举类型
      参见:
    • getStaticFinal

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

      public static Object getStaticFinal(MethodHandles.Lookup lookup, String name, Class<?> type)
      返回在类中声明的与字段类型相同的静态final字段的值(或对于基本类型字段,在包装类中声明的字段)。这是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,或者,如果 dstTypeboolean,则转换为 int,然后根据最低有效位是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