java.lang.Object
java.lang.invoke.ConstantBootstraps
动态计算常量的引导方法。
此类中的引导程序方法将为任何 null 引用参数抛出 NullPointerException ,除非该参数被指定为未使用或被指定为接受 null 值。
- 自从:
- 11
-
方法总结
修饰符和类型方法描述static VarHandlearrayVarHandle(MethodHandles.Lookup lookup, String name, Class<VarHandle> type, Class<?> arrayClass) 查找数组类型的VarHandle。static <E extends Enum<E>>
EenumConstant(MethodHandles.Lookup lookup, String name, Class<E> type) 返回一个enum常量,其类型由type指定,名称由name指定。static ObjectexplicitCast(MethodHandles.Lookup lookup, String name, Class<?> dstType, Object value) 应用从源类型到目标类型的转换。static VarHandlefieldVarHandle(MethodHandles.Lookup lookup, String name, Class<VarHandle> type, Class<?> declaringClass, Class<?> fieldType) 为实例字段查找VarHandle。static ObjectgetStaticFinal(MethodHandles.Lookup lookup, String name, Class<?> type) 返回在类中声明的与字段类型相同的静态最终字段的值(或者,对于原始值字段,在包装类中声明。)static ObjectgetStaticFinal(MethodHandles.Lookup lookup, String name, Class<?> type, Class<?> declaringClass) 返回静态最终字段的值。static Objectinvoke(MethodHandles.Lookup lookup, String name, Class<?> type, MethodHandle handle, Object... args) 返回使用提供的参数调用方法句柄的结果。static ObjectnullConstant(MethodHandles.Lookup lookup, String name, Class<?> type) 为type指定的引用类型返回一个null对象引用。static Class<?>primitiveClass(MethodHandles.Lookup lookup, String name, Class<?> type) 返回原始类型的Class镜像,其类型描述符由name指定。static VarHandlestaticFieldVarHandle(MethodHandles.Lookup lookup, String name, Class<VarHandle> type, Class<?> declaringClass, Class<?> fieldType) 为静态字段查找VarHandle。
-
方法详情
-
nullConstant
为type指定的引用类型返回一个null对象引用。- 参数:
lookup- 未使用name- 未使用type- 引用类型- 返回:
null值- 抛出:
IllegalArgumentException- 如果type不是引用类型
-
primitiveClass
返回原始类型的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
返回在类中声明的与字段类型相同的静态最终字段的值(或者,对于原始值字段,在包装类中声明。)这是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,将发生以下情况之一:- 如果
dstType是void.class,则抛出ClassCastException。 - 如果
dstType是Object.class,则value按原样返回。
否则,以下转换之一将应用于
value:- 如果
dstType是引用类型,则将引用强制转换应用于value就像调用dstType.cast(value)一样。 - 如果
dstType是原始类型,那么,如果value的运行时类型是原始包装类型(例如Integer),则应用 Java 拆箱转换 5.1.8 然后是 Java 转换转换 5.5 直接转换为dstType,或者,如果dstType是boolean到int,然后根据最低有效位是 1 还是 0 分别转换为true或false。如果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- 当dstType是void时,当每 (1) 的转换失败时,或者当dstType是原始类型并且value的运行时类型不是原始包装类型(例如Integer)- 自从:
- 15
- 如果
-