Serializable
, Constable
, TypeDescriptor
, TypeDescriptor.OfMethod<Class<?>,MethodType>
A method type represents the arguments and return type accepted and returned by a method handle, or the arguments and return type passed and expected by a method handle caller. Method types must be properly matched between a method handle and all its callers, and the JVM's operations enforce this matching at, specifically during calls to
MethodHandle.invokeExact
and
MethodHandle.invoke
, and during execution of
invokedynamic
instructions.
The structure is a return type accompanied by any number of parameter types. The types (primitive, void
, and reference) are represented by Class
objects. (For ease of exposition, we treat void
as if it were a type. In fact, it denotes the absence of a return type.)
All instances of MethodType
are immutable. Two instances are completely interchangeable if they compare equal. Equality depends on pairwise correspondence of the return and parameter types and on nothing else.
This type can be created only by factory methods. All factory methods may cache values, though caching is not guaranteed. Some factory methods are static, while others are virtual methods which modify precursor method types, e.g., by changing a selected parameter.
Factory methods which operate on groups of parameter types are systematically presented in two versions, so that both Java arrays and Java lists can be used to work with groups of parameter types. The query methods parameterArray
and parameterList
also provide a choice between arrays and lists.
MethodType
objects are sometimes derived from bytecode instructions such as invokedynamic
, specifically from the type descriptor strings associated with the instructions in a class file's constant pool.
Like classes and strings, method types can also be represented directly in a class file's constant pool as constants. A method type may be loaded by an ldc
instruction which refers to a suitable CONSTANT_MethodType
constant pool entry. The entry refers to a CONSTANT_Utf8
spelling for the descriptor string. (For full details on method type constants, see sections 4.4.8 and 5.4.3.5 of the Java Virtual Machine Specification.)
When the JVM materializes a MethodType
from a descriptor string, all classes named in the descriptor must be accessible, and will be loaded. (But the classes need not be initialized, as is the case with a CONSTANT_Class
.) This loading may occur at any time before the MethodType
object is first derived.
A MethodType
can be described in nominal form if and only if all of the parameter types and return type can be described with a nominal descriptor
represented by ClassDesc
. If a method type can be described nominally, then:
nominal descriptor
returned by MethodType::describeConstable
.MethodType::descriptorString
or MethodType::toMethodDescriptorString
for the method type is a method descriptor (JVMS 4.3.3).If any of the parameter types or return type cannot be described nominally, i.e. Class::describeConstable
returns an empty optional for that type, then the method type cannot be described nominally:
nominal descriptor
and MethodType::describeConstable
returns an empty optional.MethodType::descriptorString
or MethodType::toMethodDescriptorString
for the method type is not a type descriptor.Finds or creates a method type with additional parameter types.
Finds or creates a method type with additional parameter types.
Finds or creates a method type with a single different parameter type.
Finds or creates a method type with a different return type.
Returns a nominal descriptor for this instance, if one can be constructed, or an empty
Optional
if one cannot be.
Returns a descriptor string for this method type.
Finds or creates a method type with some parameter types omitted.
boolean
Compares the specified object with this type for equality.
Erases all reference types to Object
.
Finds or creates an instance of a method type, given the spelling of its bytecode descriptor.
Converts all types, both reference and primitive, to Object
.
Finds or creates a method type whose components are all Object
.
Finds or creates a method type whose components are Object
with an optional trailing Object[]
array.
int
Returns the hash code value for this method type.
boolean
Reports if this type contains a primitive argument or return value.
boolean
Reports if this type contains a wrapper argument or return value.
Finds or creates a method type with additional parameter types.
Finds or creates a method type with additional parameter types.
Returns the last parameter type of this method type.
Finds or creates a method type with the given components.
Finds or creates a method type with the given components.
Finds or creates an instance of the given method type.
Finds or creates a method type with the given components.
Finds or creates a method type with the given components.
Finds or creates a method type with the given components.
Presents the parameter types as an array (a convenience method).
int
Returns the number of parameter types in this method type.
Presents the parameter types as a list (a convenience method).
Returns the parameter type at the specified index, within this method type.
Returns the return type of this method type.
Returns a descriptor string for the method type.
Returns a string representation of the method type, of the form "(PT0,PT1...)RT"
.
Converts all wrapper types to their corresponding primitive types.
Converts all primitive types to their corresponding wrapper types.
Finds or creates an instance of the given method type.
rtype
- the return type
ptypes
- the parameter types
NullPointerException
- if rtype
or ptypes
or any element of ptypes
is null
IllegalArgumentException
- if any element of ptypes
is void.class
Finds or creates a method type with the given components. Convenience method for
methodType
.
rtype
- the return type
ptypes
- the parameter types
NullPointerException
- if rtype
or ptypes
or any element of ptypes
is null
IllegalArgumentException
- if any element of ptypes
is void.class
Finds or creates a method type with the given components. Convenience method for
methodType
. The leading parameter type is prepended to the remaining array.
rtype
- the return type
ptype0
- the first parameter type
ptypes
- the remaining parameter types
NullPointerException
- if rtype
or ptype0
or ptypes
or any element of ptypes
is null
IllegalArgumentException
- if ptype0
or ptypes
or any element of ptypes
is void.class
Finds or creates a method type with the given components. Convenience method for
methodType
. The resulting method has no parameter types.
rtype
- the return type
NullPointerException
- if rtype
is null
Finds or creates a method type with the given components. Convenience method for
methodType
. The resulting method has the single given parameter type.
rtype
- the return type
ptype0
- the parameter type
NullPointerException
- if rtype
or ptype0
is null
IllegalArgumentException
- if ptype0
is void.class
Finds or creates a method type with the given components. Convenience method for
methodType
. The resulting method has the same parameter types as
ptypes
, and the specified return type.
rtype
- the return type
ptypes
- the method type which supplies the parameter types
NullPointerException
- if rtype
or ptypes
is null
Finds or creates a method type whose components are
Object
with an optional trailing
Object[]
array. Convenience method for
methodType
. All parameters and the return type will be
Object
, except the final array parameter if any, which will be
Object[]
.
objectArgCount
- number of parameters (excluding the final array parameter if any)
finalArray
- whether there will be a trailing array parameter, of type Object[]
IllegalArgumentException
- if objectArgCount
is negative or greater than 255 (or 254, if finalArray
is true)
Finds or creates a method type whose components are all
Object
. Convenience method for
methodType
. All parameters and the return type will be Object.
objectArgCount
- number of parameters
IllegalArgumentException
- if objectArgCount
is negative or greater than 255
Finds or creates a method type with a single different parameter type. Convenience method for
methodType
.
changeParameterType
in interface TypeDescriptor.OfMethod<Class<?>,MethodType>
num
- the index (zero-based) of the parameter type to change
nptype
- a new parameter type to replace the old one with
IndexOutOfBoundsException
- if num
is not a valid index into parameterArray()
IllegalArgumentException
- if nptype
is void.class
NullPointerException
- if nptype
is null
Finds or creates a method type with additional parameter types. Convenience method for
methodType
.
insertParameterTypes
in interface TypeDescriptor.OfMethod<Class<?>,MethodType>
num
- the position (zero-based) of the inserted parameter type(s)
ptypesToInsert
- zero or more new parameter types to insert into the parameter list
IndexOutOfBoundsException
- if num
is negative or greater than parameterCount()
IllegalArgumentException
- if any element of ptypesToInsert
is void.class
or if the resulting method type would have more than 255 parameter slots
NullPointerException
- if ptypesToInsert
or any of its elements is null
Finds or creates a method type with additional parameter types. Convenience method for
methodType
.
ptypesToInsert
- zero or more new parameter types to insert after the end of the parameter list
IllegalArgumentException
- if any element of ptypesToInsert
is void.class
or if the resulting method type would have more than 255 parameter slots
NullPointerException
- if ptypesToInsert
or any of its elements is null
Finds or creates a method type with additional parameter types. Convenience method for
methodType
.
num
- the position (zero-based) of the inserted parameter type(s)
ptypesToInsert
- zero or more new parameter types to insert into the parameter list
IndexOutOfBoundsException
- if num
is negative or greater than parameterCount()
IllegalArgumentException
- if any element of ptypesToInsert
is void.class
or if the resulting method type would have more than 255 parameter slots
NullPointerException
- if ptypesToInsert
or any of its elements is null
Finds or creates a method type with additional parameter types. Convenience method for
methodType
.
ptypesToInsert
- zero or more new parameter types to insert after the end of the parameter list
IllegalArgumentException
- if any element of ptypesToInsert
is void.class
or if the resulting method type would have more than 255 parameter slots
NullPointerException
- if ptypesToInsert
or any of its elements is null
Finds or creates a method type with some parameter types omitted. Convenience method for
methodType
.
dropParameterTypes
in interface TypeDescriptor.OfMethod<Class<?>,MethodType>
start
- the index (zero-based) of the first parameter type to remove
end
- the index (greater than start
) of the first parameter type after not to remove
IndexOutOfBoundsException
- if start
is negative or greater than parameterCount()
or if end
is negative or greater than parameterCount()
or if start
is greater than end
Finds or creates a method type with a different return type. Convenience method for
methodType
.
changeReturnType
in interface TypeDescriptor.OfMethod<Class<?>,MethodType>
nrtype
- a return parameter type to replace the old one with
NullPointerException
- if nrtype
is null
public boolean hasPrimitives()
Reports if this type contains a primitive argument or return value. The return type void
counts as a primitive.
public boolean hasWrappers()
Reports if this type contains a wrapper argument or return value. Wrappers are types which box primitive values, such as
Integer
. The reference type
java.lang.Void
counts as a wrapper, if it occurs as a return type.
Erases all reference types to
Object
. Convenience method for
methodType
. All primitive types (including
void
) will remain unchanged.
Converts all types, both reference and primitive, to
Object
. Convenience method for
genericMethodType
. The expression
type.wrap().erase()
produces the same value as
type.generic()
.
Converts all primitive types to their corresponding wrapper types. Convenience method for
methodType
. All reference types (including wrapper types) will remain unchanged. A
void
return type is changed to the type
java.lang.Void
. The expression
type.wrap().erase()
produces the same value as
type.generic()
.
Converts all wrapper types to their corresponding primitive types. Convenience method for
methodType
. All primitive types (including
void
) will remain unchanged. A return type of
java.lang.Void
is changed to
void
.
Returns the parameter type at the specified index, within this method type.
parameterType
in interface TypeDescriptor.OfMethod<Class<?>,MethodType>
num
- the index (zero-based) of the desired parameter type
IndexOutOfBoundsException
- if num
is not a valid index into parameterArray()
public int parameterCount()
Returns the number of parameter types in this method type.
parameterCount
in interface TypeDescriptor.OfMethod<Class<?>,MethodType>
()
Returns the return type of this method type.
returnType
in interface TypeDescriptor.OfMethod<Class<?>,MethodType>
Presents the parameter types as a list (a convenience method). The list will be immutable.
parameterList
in interface TypeDescriptor.OfMethod<Class<?>,MethodType>
()
Returns the last parameter type of this method type. If this type has no parameters, the sentinel value void.class
is returned instead.
The sentinel value is chosen so that reflective queries can be made directly against the result value. The sentinel value cannot be confused with a real parameter, since void
is never acceptable as a parameter type. For variable arity invocation modes, the expression lastParameterType().getComponentType()
is useful to query the type of the "varargs" parameter.
void.class
()
Presents the parameter types as an array (a convenience method). Changes to the array will not result in changes to the type.
parameterArray
in interface TypeDescriptor.OfMethod<Class<?>,MethodType>
Compares the specified object with this type for equality. That is, it returns true
if and only if the specified object is also a method type with exactly the same parameters and return type.
public int hashCode()
Returns the hash code value for this method type. It is defined to be the same as the hashcode of a List whose elements are the return type followed by the parameter types.
Returns a string representation of the method type, of the form
"(PT0,PT1...)RT"
. The string representation of a method type is a parenthesis enclosed, comma separated list of type names, followed immediately by the return type.
Each type is represented by its simple name
.
Finds or creates an instance of a method type, given the spelling of its bytecode descriptor. Convenience method for
methodType
. Any class or interface name embedded in the descriptor string will be resolved by the given loader (or if it is null, on the system class loader).
Note that it is possible to encounter method types which cannot be constructed by this method, because their component types are not all reachable from a common class loader.
This method is included for the benefit of applications that must generate bytecodes that process method handles and invokedynamic
.
descriptor
- a bytecode-level type descriptor string "(T...)T"
loader
- the class loader in which to look up the types
NullPointerException
- if the string is null
IllegalArgumentException
- if the string is not well-formed
TypeNotPresentException
- if a named type cannot be found
SecurityException
- if the security manager is present and loader
is null
and the caller does not have the RuntimePermission
("getClassLoader")
()
Returns a descriptor string for the method type. This method is equivalent to calling
MethodType::descriptorString
.
Note that this is not a strict inverse of fromMethodDescriptorString
. Two distinct classes which share a common name but have different class loaders will appear identical when viewed within descriptor strings.
This method is included for the benefit of applications that must generate bytecodes that process method handles and invokedynamic
. fromMethodDescriptorString
, because the latter requires a suitable class loader argument.
()
descriptorString
in interface TypeDescriptor
Returns a nominal descriptor for this instance, if one can be constructed, or an empty
Optional
if one cannot be.
describeConstable
in interface Constable
Optional
containing the resulting nominal descriptor, or an empty Optional
if one cannot be constructed.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4