# Print output for @column tags ?>
public
interface
MethodHandleInfo
java.lang.invoke.MethodHandleInfo |
A symbolic reference obtained by cracking a direct method handle
into its consitutent symbolic parts.
To crack a direct method handle, call Lookup#revealDirect
.
ldc
instruction on a CONSTANT_MethodHandle
constant.
(See the Java Virtual Machine Specification, sections 4.4.8 and 5.4.3.)
Lookup#findVirtual
,
to resolve a symbolic reference into a method handle.
A symbolic reference consists of a class, name string, and type.
Lookup#unreflect
or Lookup#unreflectSpecial
to convert a Method
into a method handle.
Lookup#unreflectConstructor
to convert a Constructor
into a method handle.
Lookup#unreflectGetter
or Lookup#unreflectSetter
to convert a Field
into a method handle.
Lookup
object, it is possible to crack any direct method handle
to recover a symbolic reference for the underlying method, constructor, or field.
Cracking must be done via a Lookup
object equivalent to that which created
the target method handle, or which has enough access permissions to recreate
an equivalent method handle.
If the underlying method is caller sensitive,
the direct method handle will have been "bound" to a particular caller class, the
lookup class
of the lookup object used to create it.
Cracking this method handle with a different lookup class will fail
even if the underlying method is public (like Class.forName
).
The requirement of lookup object matching provides a "fast fail" behavior
for programs which may otherwise trust erroneous revelation of a method
handle with symbolic information (or caller binding) from an unexpected scope.
Use MethodHandles.reflectAs(Class
to override this limitation.
reference kind | descriptive name | scope | member | behavior |
---|---|---|---|---|
1 | REF_getField | class |
FT f; | (T) this.f; |
2 | REF_getStatic | class or interface |
static FT f; | (T) C.f; |
3 | REF_putField | class |
FT f; | this.f = x; |
4 | REF_putStatic | class |
static FT f; | C.f = arg; |
5 | REF_invokeVirtual | class |
T m(A*); | (T) this.m(arg*); |
6 | REF_invokeStatic | class or interface |
static T m(A*); | (T) C.m(arg*); |
7 | REF_invokeSpecial | class or interface |
T m(A*); | (T) super.m(arg*); |
8 | REF_newInvokeSpecial | class |
C(A*); | new C(arg*); |
9 | REF_invokeInterface | interface |
T m(A*); | (T) this.m(arg*); |
Constants | |
---|---|
int |
REF_getField
A direct method handle reference kind, as defined in the table above. |
int |
REF_getStatic
|
int |
REF_invokeInterface
|
int |
REF_invokeSpecial
|
int |
REF_invokeStatic
|
int |
REF_invokeVirtual
|
int |
REF_newInvokeSpecial
|
int |
REF_putField
|
int |
REF_putStatic
|
Public methods | |
---|---|
abstract
Class<?>
|
getDeclaringClass()
Returns the class in which the cracked method handle's underlying member was defined. |
abstract
MethodType
|
getMethodType()
Returns the nominal type of the cracked symbolic reference, expressed as a method type. |
abstract
int
|
getModifiers()
Returns the access modifiers of the underlying member. |
abstract
String
|
getName()
Returns the name of the cracked method handle's underlying member. |
abstract
int
|
getReferenceKind()
Returns the reference kind of the cracked method handle, which in turn determines whether the method handle's underlying member was a constructor, method, or field. |
default
boolean
|
isVarArgs()
Determines if the underlying member was a variable arity method or constructor. |
static
boolean
|
refKindIsField(int refKind)
This method is deprecated.
This internal method was accidentally added to API 26 and must not be used. No
replacement is available but it is possible to replicate using information from
the table above, e.g.
|
static
boolean
|
refKindIsValid(int refKind)
This method is deprecated.
This internal method was accidentally added to API 26 and must not be used. No
replacement is available but it is possible to replicate using information from
the table above, e.g.
|
static
String
|
refKindName(int refKind)
This method is deprecated.
This internal method was accidentally added to API 26 and must not be used. Use
|
static
String
|
referenceKindToString(int referenceKind)
Returns the descriptive name of the given reference kind, as defined in the table above. |
abstract
<T extends Member>
T
|
reflectAs(Class<T> expected, MethodHandles.Lookup lookup)
Reflects the underlying member as a method, constructor, or field object. |
static
String
|
toString(int kind, Class<?> defc, String name, MethodType type)
Returns a string representation for a |
public static final int REF_getField
A direct method handle reference kind, as defined in the table above.
Constant Value: 1 (0x00000001)
public static final int REF_getStatic
Constant Value: 2 (0x00000002)
public static final int REF_invokeInterface
Constant Value: 9 (0x00000009)
public static final int REF_invokeSpecial
Constant Value: 7 (0x00000007)
public static final int REF_invokeStatic
Constant Value: 6 (0x00000006)
public static final int REF_invokeVirtual
Constant Value: 5 (0x00000005)
public static final int REF_newInvokeSpecial
Constant Value: 8 (0x00000008)
public static final int REF_putField
Constant Value: 3 (0x00000003)
public static final int REF_putStatic
Constant Value: 4 (0x00000004)
public abstract Class<?> getDeclaringClass ()
Returns the class in which the cracked method handle's underlying member was defined.
Returns | |
---|---|
Class<?> |
the declaring class of the underlying member |
public abstract MethodType getMethodType ()
Returns the nominal type of the cracked symbolic reference, expressed as a method type.
If the reference is to a constructor, the return type will be void
.
If it is to a non-static method, the method type will not mention the this
parameter.
If it is to a field and the requested access is to read the field,
the method type will have no parameters and return the field type.
If it is to a field and the requested access is to write the field,
the method type will have one parameter of the field type and return void
.
Note that original direct method handle may include a leading this
parameter,
or (in the case of a constructor) will replace the void
return type
with the constructed class.
The nominal type does not include any this
parameter,
and (in the case of a constructor) will return void
.
Returns | |
---|---|
MethodType |
the type of the underlying member, expressed as a method type |
public abstract int getModifiers ()
Returns the access modifiers of the underlying member.
Returns | |
---|---|
int |
the Java language modifiers for underlying member, or -1 if the member cannot be accessed |
public abstract String getName ()
Returns the name of the cracked method handle's underlying member.
This is "<init>"
if the underlying member was a constructor,
else it is a simple method name or field name.
Returns | |
---|---|
String |
the simple name of the underlying member |
public abstract int getReferenceKind ()
Returns the reference kind of the cracked method handle, which in turn determines whether the method handle's underlying member was a constructor, method, or field. See the table above for definitions.
Returns | |
---|---|
int |
the integer code for the kind of reference used to access the underlying member |
public boolean isVarArgs ()
Determines if the underlying member was a variable arity method or constructor. Such members are represented by method handles that are varargs collectors.
getReferenceKind() >= REF_invokeVirtual && Modifier.isTransient(getModifiers())
Returns | |
---|---|
boolean |
true if and only if the underlying member was declared with variable arity. |
public static boolean refKindIsField (int refKind)
This method is deprecated.
This internal method was accidentally added to API 26 and must not be used. No
replacement is available but it is possible to replicate using information from
the table above, e.g.
refKind >= 1 && refKind <= 4
. There are no guarantees that this logic
will work if future versions extend the table.
Parameters | |
---|---|
refKind |
int |
Returns | |
---|---|
boolean |
public static boolean refKindIsValid (int refKind)
This method is deprecated.
This internal method was accidentally added to API 26 and must not be used. No
replacement is available but it is possible to replicate using information from
the table above, e.g.
refKind >= 1 && refKind <= 9
. There are no guarantees that this logic
will work if future versions extend the table.
Parameters | |
---|---|
refKind |
int |
Returns | |
---|---|
boolean |
public static String refKindName (int refKind)
This method is deprecated.
This internal method was accidentally added to API 26 and must not be used. Use
MethodHandleInfo#referenceKindToString(int)
instead.
Parameters | |
---|---|
refKind |
int |
Returns | |
---|---|
String |
public static String referenceKindToString (int referenceKind)
Returns the descriptive name of the given reference kind, as defined in the table above. The conventional prefix "REF_" is omitted.
Parameters | |
---|---|
referenceKind |
int : an integer code for a kind of reference used to access a class member |
Returns | |
---|---|
String |
a mixed-case string such as "getField" |
Throws | |
---|---|
IllegalArgumentException |
if the argument is not a valid reference kind number |
public abstract T reflectAs (Class<T> expected, MethodHandles.Lookup lookup)
Reflects the underlying member as a method, constructor, or field object.
If the underlying member is public, it is reflected as if by
getMethod
, getConstructor
, or getField
.
Otherwise, it is reflected as if by
getDeclaredMethod
, getDeclaredConstructor
, or getDeclaredField
.
The underlying member must be accessible to the given lookup object.
Parameters | |
---|---|
expected |
Class : a class object representing the desired result type T |
lookup |
MethodHandles.Lookup : the lookup object that created this MethodHandleInfo, or one with equivalent access privileges |
Returns | |
---|---|
T |
a reference to the method, constructor, or field object |
Throws | |
---|---|
ClassCastException |
if the member is not of the expected type |
NullPointerException |
if either argument is null |
IllegalArgumentException |
if the underlying member is not accessible to the given lookup object |
public static String toString (int kind, Class<?> defc, String name, MethodType type)
Returns a string representation for a MethodHandleInfo
,
given the four parts of its symbolic reference.
This is defined to be of the form "RK C.N:MT"
, where RK
is the
reference kind string for kind
,
C
is the name of defc
N
is the name
, and
MT
is the type
.
These four values may be obtained from the
reference kind,
declaring class,
member name,
and method type
of a MethodHandleInfo
object.
String.format("%s %s.%s:%s", referenceKindToString(kind), defc.getName(), name, type)
Parameters | |
---|---|
kind |
int : the reference kind part of the symbolic reference |
defc |
Class : the declaring class part of the symbolic reference |
name |
String : the member name part of the symbolic reference |
type |
MethodType : the method type part of the symbolic reference |
Returns | |
---|---|
String |
a string of the form "RK C.N:MT" |
Throws | |
---|---|
IllegalArgumentException |
if the first argument is not a valid reference kind number |
NullPointerException |
if any reference argument is null |