java.lang.Object
java.lang.invoke.ConstantBootstraps
动态计算常量的引导方法。
此类中的引导方法将为任何引用参数引发NullPointerException
,除非指定参数未使用或指定接受null
值。
- 自:
- 11
-
Method Summary
Modifier and TypeMethodDescriptionstatic 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) 返回由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) 返回在类中声明的与字段类型相同的静态final字段的值(或对于基本类型字段,在包装类中声明的字段)。static Object
getStaticFinal
(MethodHandles.Lookup lookup, String name, Class<?> type, Class<?> declaringClass) 返回静态final字段的值。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) 返回由name
指定的基本类型的类型描述符的Class
镜像。static VarHandle
staticFieldVarHandle
(MethodHandles.Lookup lookup, String name, Class<VarHandle> type, Class<?> declaringClass, Class<?> fieldType) 为静态字段查找VarHandle
。
-
Method Details
-
nullConstant
返回由type
指定的引用类型的null
对象引用。- 参数:
-
lookup
- 未使用 -
name
- 未使用 -
type
- 引用类型 - 返回:
-
一个
null
值 - 抛出:
-
IllegalArgumentException
- 如果type
不是引用类型
-
primitiveClass
返回由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
返回在类中声明的与字段类型相同的静态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
,将发生以下情况之一:- 如果
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
- 如果
-