java.lang.Object
java.lang.invoke.ConstantBootstraps
动态计算常量的引导方法。
此类中的引导程序方法将为任何 null
引用参数抛出 NullPointerException
,除非该参数被指定为未使用或被指定为接受 null
值。
- 自从:
- 11
-
方法总结
修饰符和类型方法描述static VarHandle
arrayVarHandle
(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 Object
explicitCast
(MethodHandles.Lookup lookup, String name, Class<?> dstType, Object value) 应用从源类型到目标类型的转换。static VarHandle
fieldVarHandle
(MethodHandles.Lookup lookup, String name, Class<VarHandle> type, Class<?> declaringClass, Class<?> fieldType) 为实例字段查找VarHandle
。static Object
getStaticFinal
(MethodHandles.Lookup lookup, String name, Class<?> type) 返回在类中声明的与字段类型相同的静态最终字段的值(或者,对于原始值字段,在包装类中声明。)static Object
getStaticFinal
(MethodHandles.Lookup lookup, String name, Class<?> type, Class<?> declaringClass) 返回静态最终字段的值。static Object
invoke
(MethodHandles.Lookup lookup, String name, Class<?> type, MethodHandle handle, Object... args) 返回使用提供的参数调用方法句柄的结果。static Object
nullConstant
(MethodHandles.Lookup lookup, String name, Class<?> type) 为type
指定的引用类型返回一个null
对象引用。static Class<?>
primitiveClass
(MethodHandles.Lookup lookup, String name, Class<?> type) 返回原始类型的Class
镜像,其类型描述符由name
指定。static VarHandle
staticFieldVarHandle
(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
- 如果
-