-
public interface MethodHandleInfo
通过将直接方法句柄分解为其构成符号部分而获得的符号引用。 要破解直接方法句柄,请致电Lookup.revealDirect
。直接方法句柄
直接方法句柄表示方法,构造函数或字段,没有任何插入参数绑定或其他转换。 直接方法句柄引用的方法,构造函数或字段称为其底层成员 。 可以通过以下任何方式获得直接方法句柄:- 通过对
CONSTANT_MethodHandle
常量执行ldc
指令。 (请参阅Java虚拟机规范,第4.4.8和5.4.3节。) - 通过调用Lookup Factory Methods之一 (例如
Lookup.findVirtual
)将符号引用解析为方法句柄。 符号引用由类,名称字符串和类型组成。 - 通过调用工厂方法
Lookup.unreflect
或Lookup.unreflectSpecial
将方法
转换为方法句柄。 - 通过调用工厂方法
Lookup.unreflectConstructor
将构造器
转换为方法句柄。 - 通过调用工厂方法
Lookup.unreflectGetter
或Lookup.unreflectSetter
将字段
转换为方法句柄。
破解限制
给定一个合适的Lookup
对象,可以破解任何直接方法句柄来恢复底层方法,构造函数或字段的符号引用。 必须通过Lookup
对象完成破解,该对象等同于创建目标方法句柄的对象,或具有足够的访问权限来重新创建等效方法句柄。如果底层方法是caller sensitive ,则直接方法句柄将“绑定”到特定调用者类,即用于创建它的查找对象的lookup class 。 即使底层方法是公共的(例如
Class.forName
),使用不同的查找类破解此方法句柄也将失败。查找对象匹配的要求为程序提供了“快速失败”行为,否则该程序可能会信任来自意外范围的具有符号信息(或调用者绑定)的方法句柄的错误启示。 使用
MethodHandles.reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandle)
覆盖此限制。参考种类
Lookup Factory Methods对应于方法,构造函数和字段的所有主要用例。 可以使用小整数区分这些用例,如下所示: reference kinds reference kind descriptive name scope member behavior1
REF_getField
class
FT f;
(T) this.f;
2
REF_getStatic
class
orinterface
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
orinterface
static
T m(A*);
(T) C.m(arg*);
7
REF_invokeSpecial
class
orinterface
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*);
- 从以下版本开始:
- 1.8
- 通过对
-
-
字段汇总
字段 变量和类型 字段 描述 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中所定义。
-
方法摘要
所有方法 静态方法 实例方法 抽象方法 Default Methods 变量和类型 方法 描述 类<?>
getDeclaringClass()
返回定义了破解方法句柄的基础成员的类。MethodType
getMethodType()
返回破解的符号引用的名义类型,表示为方法类型。int
getModifiers()
返回基础成员的访问修饰符。String
getName()
返回已破解方法句柄的基础成员的名称。int
getReferenceKind()
返回破解方法句柄的引用类型,该句柄依次确定方法句柄的底层成员是构造函数,方法还是字段。default boolean
isVarArgs()
确定底层成员是否是变量arity方法或构造函数。static String
referenceKindToString(int referenceKind)
返回给定引用类型的描述性名称,如 table above中所定义。<T extends Member>
TreflectAs(类<T> expected, MethodHandles.Lookup lookup)
将底层成员反映为方法,构造函数或字段对象。static String
toString(int kind, 类<?> defc, String name, MethodType type)
给出其符号引用的四个部分,返回MethodHandleInfo
的字符串表示形式。
-
-
-
字段详细信息
-
REF_getField
static final int REF_getField
直接方法句柄引用类型,如 table above中所定义。- 另请参见:
- 常数字段值
-
REF_getStatic
static final int REF_getStatic
直接方法句柄引用类型,如 table above中所定义。- 另请参见:
- 常数字段值
-
REF_putField
static final int REF_putField
直接方法句柄引用类型,如 table above中所定义。- 另请参见:
- 常数字段值
-
REF_putStatic
static final int REF_putStatic
直接方法句柄引用类型,如 table above中所定义。- 另请参见:
- 常数字段值
-
REF_invokeVirtual
static final int REF_invokeVirtual
直接方法句柄引用类型,如 table above中所定义。- 另请参见:
- 常数字段值
-
REF_invokeStatic
static final int REF_invokeStatic
直接方法句柄引用类型,如 table above中所定义。- 另请参见:
- 常数字段值
-
REF_invokeSpecial
static final int REF_invokeSpecial
直接方法句柄引用类型,如 table above中所定义。- 另请参见:
- 常数字段值
-
REF_newInvokeSpecial
static final int REF_newInvokeSpecial
直接方法句柄引用类型,如 table above中所定义。- 另请参见:
- 常数字段值
-
REF_invokeInterface
static final int REF_invokeInterface
直接方法句柄引用类型,如 table above中所定义。- 另请参见:
- 常数字段值
-
-
方法详细信息
-
getReferenceKind
int getReferenceKind()
返回破解方法句柄的引用类型,该句柄依次确定方法句柄的底层成员是构造函数,方法还是字段。 有关定义,请参见table above 。- 结果
- 用于访问底层成员的引用类型的整数代码
-
getDeclaringClass
类<?> getDeclaringClass()
返回定义了破解方法句柄的基础成员的类。- 结果
- 底层成员的声明类
-
getName
String getName()
返回已破解方法句柄的基础成员的名称。 如果底层成员是构造函数,则为"<init>"
,否则它是一个简单的方法名称或字段名称。- 结果
- 底层成员的简单名称
-
getMethodType
MethodType getMethodType()
返回破解的符号引用的名义类型,表示为方法类型。 如果引用是构造函数,则返回类型将为void
。 如果是非静态方法,则方法类型不会提及this
参数。 如果是字段并且请求的访问是读取字段,则方法类型将没有参数并返回字段类型。 如果是字段并且请求的访问是写入字段,则方法类型将具有字段类型的一个参数并返回void
。请注意,原始直接方法句柄可能包含前导
this
参数,或者(在构造函数的情况下)将使用构造的类替换void
返回类型。 标称类型不包括任何this
参数,并且(在构造函数的情况下)将返回void
。- 结果
- 底层成员的类型,表示为方法类型
-
reflectAs
<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
- 如果给定查找对象无法访问基础成员
-
getModifiers
int getModifiers()
返回基础成员的访问修饰符。- 结果
- 底层成员的Java语言修饰符,如果无法访问该成员,则返回-1
- 另请参见:
-
Modifier
,reflectAs(java.lang.Class<T>, java.lang.invoke.MethodHandles.Lookup)
-
isVarArgs
default boolean isVarArgs()
确定底层成员是否是变量arity方法或构造函数。 这些成员由作为varargs收集器的方法句柄表示。- 实现要求:
-
这产生的结果相当于:
getReferenceKind() >= REF_invokeVirtual && Modifier.isTransient(getModifiers())
- 结果
-
true
当且仅当基础成员声明为变量arity时。
-
referenceKindToString
static String referenceKindToString(int referenceKind)
返回给定引用类型的描述性名称,如table above中所定义。 省略了传统的前缀“REF_”。- 参数
-
referenceKind
- 用于访问类成员的一种引用的整数代码 - 结果
-
一个混合大小写的字符串,如
"getField"
- 异常
-
IllegalArgumentException
- 如果参数不是有效的 reference kind number
-
toString
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 isnull
-
-