Class ConstantBootstraps
public final class ConstantBootstraps extends Object
The bootstrap methods in this class will throw a NullPointerException
for any reference argument that is null
, unless the argument is specified to be unused or specified to accept a null
value.
- Since:
- 11
Method Summary
Modifier and Type | Method | Description |
---|---|---|
static VarHandle |
arrayVarHandle |
Finds a VarHandle for an array type. |
static <E extends Enum<E>> |
enumConstant |
Returns an enum constant of the type specified by type with the name specified by name . |
static Object |
explicitCast |
Applies a conversion from a source type to a destination type. |
static VarHandle |
fieldVarHandle |
Finds a VarHandle for an instance field. |
static Object |
getStaticFinal |
Returns the value of a static final field declared in the class which is the same as the field's type (or, for primitive-valued fields, declared in the wrapper class.) |
static Object |
getStaticFinal |
Returns the value of a static final field. |
static Object |
invoke |
Returns the result of invoking a method handle with the provided arguments. |
static Object |
nullConstant |
Returns a null object reference for the reference type specified by type . |
static Class<?> |
primitiveClass |
Returns a Class mirror for the primitive type whose type descriptor is specified by name . |
static VarHandle |
staticFieldVarHandle |
Finds a VarHandle for a static field. |
Method Details
nullConstant
public static Object nullConstant(MethodHandles.Lookup lookup, String name, Class<?> type)
null
object reference for the reference type specified by type
.- Parameters:
-
lookup
- unused -
name
- unused -
type
- a reference type - Returns:
- a
null
value - Throws:
-
IllegalArgumentException
- iftype
is not a reference type
primitiveClass
public static Class<?> primitiveClass(MethodHandles.Lookup lookup, String name, Class<?> type)
Class
mirror for the primitive type whose type descriptor is specified by name
.- Parameters:
-
lookup
- unused -
name
- the descriptor (JVMS 4.3) of the desired primitive type -
type
- the required result type (must beClass.class
) - Returns:
- the
Class
mirror - Throws:
-
IllegalArgumentException
- if the name is not a descriptor for a primitive type or the type is notClass.class
enumConstant
public static <E extends Enum<E>> E enumConstant(MethodHandles.Lookup lookup, String name, Class<E> type)
enum
constant of the type specified by type
with the name specified by name
.- Type Parameters:
-
E
- The enum type for which a constant value is to be returned - Parameters:
-
lookup
- the lookup context describing the class performing the operation (normally stacked by the JVM) -
name
- the name of the constant to return, which must exactly match an enum constant in the specified type. -
type
- theClass
object describing the enum type for which a constant is to be returned - Returns:
- the enum constant of the specified enum type with the specified name
- Throws:
-
IllegalAccessError
- if the declaring class or the field is not accessible to the class performing the operation -
IllegalArgumentException
- if the specified enum type has no constant with the specified name, or the specified class object does not represent an enum type - See Also:
getStaticFinal
public static Object getStaticFinal(MethodHandles.Lookup lookup, String name, Class<?> type, Class<?> declaringClass)
- Parameters:
-
lookup
- the lookup context describing the class performing the operation (normally stacked by the JVM) -
name
- the name of the field -
type
- the type of the field -
declaringClass
- the class in which the field is declared - Returns:
- the value of the field
- Throws:
-
IllegalAccessError
- if the declaring class or the field is not accessible to the class performing the operation -
NoSuchFieldError
- if the specified field does not exist -
IncompatibleClassChangeError
- if the specified field is notfinal
getStaticFinal
public static Object getStaticFinal(MethodHandles.Lookup lookup, String name, Class<?> type)
getStaticFinal(MethodHandles.Lookup, String, Class, Class)
for the case where a class declares distinguished constant instances of itself.- Parameters:
-
lookup
- the lookup context describing the class performing the operation (normally stacked by the JVM) -
name
- the name of the field -
type
- the type of the field - Returns:
- the value of the field
- Throws:
-
IllegalAccessError
- if the declaring class or the field is not accessible to the class performing the operation -
NoSuchFieldError
- if the specified field does not exist -
IncompatibleClassChangeError
- if the specified field is notfinal
- See Also:
invoke
public static Object invoke(MethodHandles.Lookup lookup, String name, Class<?> type, MethodHandle handle, Object... args) throws Throwable
This method behaves as if the method handle to be invoked is the result of adapting the given method handle, via MethodHandle.asType(java.lang.invoke.MethodType)
, to adjust the return type to the desired type.
- Parameters:
-
lookup
- unused -
name
- unused -
type
- the desired type of the value to be returned, which must be compatible with the return type of the method handle -
handle
- the method handle to be invoked -
args
- the arguments to pass to the method handle, as if withMethodHandle.invokeWithArguments(java.lang.Object...)
. Each argument may benull
. - Returns:
- the result of invoking the method handle
- Throws:
-
WrongMethodTypeException
- if the handle's method type cannot be adjusted to take the given number of arguments, or if the handle's return type cannot be adjusted to the desired type -
ClassCastException
- if an argument or the result produced by invoking the handle cannot be converted by reference casting -
Throwable
- anything thrown by the method handle invocation
fieldVarHandle
public static VarHandle fieldVarHandle(MethodHandles.Lookup lookup, String name, Class<VarHandle> type, Class<?> declaringClass, Class<?> fieldType)
VarHandle
for an instance field.- Parameters:
-
lookup
- the lookup context describing the class performing the operation (normally stacked by the JVM) -
name
- the name of the field -
type
- the required result type (must beClass<VarHandle>
) -
declaringClass
- the class in which the field is declared -
fieldType
- the type of the field - Returns:
- the
VarHandle
- Throws:
-
IllegalAccessError
- if the declaring class or the field is not accessible to the class performing the operation -
NoSuchFieldError
- if the specified field does not exist -
IllegalArgumentException
- if the type is notVarHandle
staticFieldVarHandle
public static VarHandle staticFieldVarHandle(MethodHandles.Lookup lookup, String name, Class<VarHandle> type, Class<?> declaringClass, Class<?> fieldType)
VarHandle
for a static field.- Parameters:
-
lookup
- the lookup context describing the class performing the operation (normally stacked by the JVM) -
name
- the name of the field -
type
- the required result type (must beClass<VarHandle>
) -
declaringClass
- the class in which the field is declared -
fieldType
- the type of the field - Returns:
- the
VarHandle
- Throws:
-
IllegalAccessError
- if the declaring class or the field is not accessible to the class performing the operation -
NoSuchFieldError
- if the specified field does not exist -
IllegalArgumentException
- if the type is notVarHandle
arrayVarHandle
public static VarHandle arrayVarHandle(MethodHandles.Lookup lookup, String name, Class<VarHandle> type, Class<?> arrayClass)
VarHandle
for an array type.- Parameters:
-
lookup
- the lookup context describing the class performing the operation (normally stacked by the JVM) -
name
- unused -
type
- the required result type (must beClass<VarHandle>
) -
arrayClass
- the type of the array - Returns:
- the
VarHandle
- Throws:
-
IllegalAccessError
- if the component type of the array is not accessible to the class performing the operation -
IllegalArgumentException
- if the type is notVarHandle
explicitCast
public static Object explicitCast(MethodHandles.Lookup lookup, String name, Class<?> dstType, Object value) throws ClassCastException
Given a destination type dstType
and an input value value
, one of the following will happen:
- If
dstType
isvoid.class
, aClassCastException
is thrown. - If
dstType
isObject.class
,value
is returned as is.
Otherwise one of the following conversions is applied to value
:
- If
dstType
is a reference type, a reference cast is applied tovalue
as if by callingdstType.cast(value)
. - If
dstType
is a primitive type, then, if the runtime type ofvalue
is a primitive wrapper type (such asInteger
), a Java unboxing conversion is applied 5.1.8 followed by a Java casting conversion 5.5 converting either directly todstType
, or, ifdstType
isboolean
, toint
, which is then converted to eithertrue
orfalse
depending on whether the least-significant-bit is 1 or 0 respectively. If the runtime type ofvalue
is not a primitive wrapper type aClassCastException
is thrown.
The result is the same as when using the following code:
MethodHandle id = MethodHandles.identity(dstType); MethodType mt = MethodType.methodType(dstType, Object.class); MethodHandle conv = MethodHandles.explicitCastArguments(id, mt); return conv.invoke(value);
- Parameters:
-
lookup
- unused -
name
- unused -
dstType
- the destination type of the conversion -
value
- the value to be converted - Returns:
- the converted value
- Throws:
-
ClassCastException
- whendstType
isvoid
, when a cast per (1) fails, or whendstType
is a primitive type and the runtime type ofvalue
is not a primitive wrapper type (such asInteger
) - Since:
- 15
© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/invoke/ConstantBootstraps.html