public interface MethodHandleInfo
Lookup.revealDirect
。
ldc
上的指令CONSTANT_MethodHandle
恒定。 (请参阅Java虚拟机规范,第4.4.8和5.4.3节。) Lookup.findVirtual
,将符号引用解析为方法句柄。 符号引用由类,名称字符串和类型组成。 Lookup.unreflect
或Lookup.unreflectSpecial
将方法
转换为方法句柄。 Lookup.unreflectConstructor
将Constructor
转换为方法句柄。 Lookup.unreflectGetter
或Lookup.unreflectSetter
将Field
转换为方法句柄。 Lookup
对象,可以破解任何直接方法句柄来恢复底层方法,构造函数或字段的符号引用。
破解必须通过与创建目标方法句柄的对象相当的Lookup
对象完成,或者具有足够的访问权限来重新创建等价的方法句柄。
如果底层方法是caller sensitive ,则直接方法句柄将被“绑定”到特定的调用者类,用于创建它的查找对象的lookup class 。 即使底层方法是公开的(如Class.forName
),用不同的查找类破解此方法句柄也将失败。
查找对象匹配的要求为程序提供了一个“快速失败”行为,否则可能会从意外的范围信任符号信息(或调用者绑定)的方法句柄的错误启发。 使用MethodHandles.reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandle)
来覆盖此限制。
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*);
Modifier and Type | Field and Description |
---|---|
static int |
REF_getField
一种直接方法句柄引用类,如在限定的
table above 。
|
static int |
REF_getStatic
一种直接方法句柄引用类,如在限定的
table above 。
|
static int |
REF_invokeInterface
一种直接方法句柄引用类,如在限定的
table above 。
|
static int |
REF_invokeSpecial
一种直接方法句柄引用类,如在限定的
table above 。
|
static int |
REF_invokeStatic
一种直接方法句柄引用类,如在限定的
table above 。
|
static int |
REF_invokeVirtual
一种直接方法句柄引用类,如在限定的
table above 。
|
static int |
REF_newInvokeSpecial
一种直接方法句柄引用类,如在限定的
table above 。
|
static int |
REF_putField
一种直接方法句柄引用类,如在限定的
table above 。
|
static int |
REF_putStatic
一种直接方法句柄引用类,如在限定的
table above 。
|
Modifier and Type | Method and Description |
---|---|
类<?> |
getDeclaringClass()
返回定义了破解方法句柄的基础成员的类。
|
MethodType |
getMethodType()
返回破解的符号引用的标称类型,表示为方法类型。
|
int |
getModifiers()
返回底层成员的访问修饰符。
|
String |
getName()
返回破解方法句柄的底层成员的名称。
|
int |
getReferenceKind()
返回破解方法句柄的引用类型,这反过来确定方法句柄的底层成员是构造函数,方法还是字段。
|
default boolean |
isVarArgs()
确定底层成员是变量arity方法还是构造函数。
|
static String |
referenceKindToString(int referenceKind)
返回给定参考样的描述性名称,如定义
table above 。
|
<T extends Member> |
reflectAs(类<T> expected, MethodHandles.Lookup lookup)
将基础成员反映为方法,构造函数或字段对象。
|
static String |
toString(int kind, 类<?> defc, String name, MethodType type)
返回一个字符串表示
MethodHandleInfo 给出的四个部分的符号引用的。
|
static final int REF_getField
static final int REF_getStatic
static final int REF_putField
static final int REF_putStatic
static final int REF_invokeVirtual
static final int REF_invokeStatic
static final int REF_invokeSpecial
static final int REF_newInvokeSpecial
static final int REF_invokeInterface
int getReferenceKind()
类<?> getDeclaringClass()
String getName()
"<init>"
如果底层成员是一个构造函数,否则它是一个简单的方法名或字段名。
MethodType getMethodType()
void
。
如果是非静态方法,方法类型不会提到this
参数。
如果是一个字段,并且所请求的访问是读取该字段,那么方法类型将没有参数并返回字段类型。
如果是一个字段,并且所请求的访问是写入该字段,则方法类型将具有字段类型的一个参数并返回void
。
请注意,原始直接方法句柄可能包括一个前导的this
参数,或者(在this
函数的情况下)将替换构造的类的void
返回类型。 标称类型不包括任何this
参数,(在this
函数的情况下)将返回void
。
<T extends Member> T reflectAs(类<T> expected, MethodHandles.Lookup lookup)
getMethod
, getConstructor
,或getField
。
否则,它被反映为如果由getDeclaredMethod
, getDeclaredConstructor
,或getDeclaredField
。
给定的查找对象必须可访问底层成员。
T
- 所需类型的结果, Member
或子类型
expected
- 表示所需结果类型
T
的类对象
lookup
- 创建此MethodHandleInfo或具有等效访问权限的查找对象
ClassCastException
- 如果该成员不是预期类型
NullPointerException
- 如果任一参数是
null
IllegalArgumentException
- 如果基础成员不可访问给定的查找对象
int getModifiers()
Modifier
, reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandles.Lookup)
default boolean isVarArgs()
getReferenceKind() >= REF_invokeVirtual && Modifier.isTransient(getModifiers())
true
当且仅当底层成员被声明为可变的。
static String referenceKindToString(int referenceKind)
referenceKind
- 用于访问类成员的一种引用类型的整数代码
"getField"
IllegalArgumentException
- 如果参数不是有效的
reference kind number
static String toString(int kind, 类<?> defc, String name, MethodType type)
MethodHandleInfo
给出的四个部分的符号引用的。
这被定义为是这样的形式的"RK C.N:MT"
,其中RK
是reference kind string为kind
, C
是name的defc
N
是name
和MT
是type
。
这四个值可以从获得reference kind , declaring class , member name和method type一个的MethodHandleInfo
对象。
String.format("%s %s.%s:%s", referenceKindToString(kind), defc.getName(), name, type)
kind
-
reference kind部分符号参考
defc
-
declaring class部分符号参考
name
-
member name部分符号参考
type
-
method type部分符号参考
"RK C.N:MT"
IllegalArgumentException
- 如果第一个参数不是有效的
reference kind number
NullPointerException
- if any reference argument is
null