-
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将一个Constructor转换成方法句柄。 - 通过调用工厂方法
Lookup.unreflectGetter或Lookup.unreflectSetter将Field转换为方法句柄。
开裂限制
给定一个合适的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 behavior1REF_getFieldclassFT f;(T) this.f;2REF_getStaticclassorinterfacestaticFT f;(T) C.f;3REF_putFieldclassFT f;this.f = x;4REF_putStaticclassstaticFT f;C.f = arg;5REF_invokeVirtualclassT m(A*);(T) this.m(arg*);6REF_invokeStaticclassorinterfacestaticT m(A*);(T) C.m(arg*);7REF_invokeSpecialclassorinterfaceT m(A*);(T) super.m(arg*);8REF_newInvokeSpecialclassC(A*);new C(arg*);9REF_invokeInterfaceinterfaceT m(A*);(T) this.m(arg*);- 从以下版本开始:
- 1.8
- 通过在
-
-
Field Summary
Fields Modifier and Type Field 描述 static intREF_getField一个直接方法句柄参考类型,如 table above所定义。static intREF_getStatic一个直接方法句柄参考类,如 table above所定义。static intREF_invokeInterface一个直接方法句柄参考类,如 table above所定义。static intREF_invokeSpecial一个直接方法句柄参考类,如 table above所定义。static intREF_invokeStatic一个直接方法句柄参考类,如 table above所定义。static intREF_invokeVirtual一个直接方法句柄参考类,如 table above所定义。static intREF_newInvokeSpecial一个直接方法句柄参考类,如 table above所定义。static intREF_putField一个直接方法句柄参考类,如 table above所定义。static intREF_putStatic一个直接方法句柄参考类,如 table above所定义。
-
方法摘要
所有方法 静态方法 接口方法 抽象方法 Default Methods Modifier and Type 方法 描述 Class<?>getDeclaringClass()返回定义了破解方法句柄的基础成员的类。MethodTypegetMethodType()返回破解的符号引用的标称类型,表示为方法类型。intgetModifiers()返回底层成员的访问修饰符。StringgetName()返回破解方法句柄的底层成员的名称。intgetReferenceKind()返回破解方法句柄的引用类型,这反过来确定方法句柄的底层成员是构造函数,方法还是字段。default booleanisVarArgs()确定底层成员是变量arity方法还是构造函数。static StringreferenceKindToString(int referenceKind)返回给定参考类型的描述性名称,如 table above中所定义。<T extends Member>
TreflectAs(Class<T> expected, MethodHandles.Lookup lookup)将基础成员反映为方法,构造函数或字段对象。static StringtoString(int kind, Class<?> defc, String name, MethodType type)给出MethodHandleInfo的字符串表示,给出其符号参考的四个部分。
-
-
-
字段详细信息
-
REF_getField
static final int REF_getField
一个直接方法句柄参考类,如 table above所定义。- 另请参见:
- Constant Field Values
-
REF_getStatic
static final int REF_getStatic
一个直接方法句柄参考类,如 table above所定义。- 另请参见:
- Constant Field Values
-
REF_putField
static final int REF_putField
一个直接方法句柄参考类,如 table above所定义。- 另请参见:
- Constant Field Values
-
REF_putStatic
static final int REF_putStatic
一个直接方法句柄参考类,如 table above所定义。- 另请参见:
- Constant Field Values
-
REF_invokeVirtual
static final int REF_invokeVirtual
一个直接方法句柄参考类,如 table above所定义。- 另请参见:
- Constant Field Values
-
REF_invokeStatic
static final int REF_invokeStatic
一个直接方法句柄参考类,如 table above所定义。- 另请参见:
- Constant Field Values
-
REF_invokeSpecial
static final int REF_invokeSpecial
一个直接方法句柄参考类,如 table above所定义。- 另请参见:
- Constant Field Values
-
REF_newInvokeSpecial
static final int REF_newInvokeSpecial
一个直接方法句柄参考类,如 table above所定义。- 另请参见:
- Constant Field Values
-
REF_invokeInterface
static final int REF_invokeInterface
一个直接方法句柄参考类,如 table above所定义。- 另请参见:
- Constant Field Values
-
-
方法详细信息
-
getReferenceKind
int getReferenceKind()
返回破解方法句柄的引用类型,这反过来确定方法句柄的底层成员是构造函数,方法还是字段。 有关定义,请参阅table above 。- 结果
- 用于访问底层成员的引用类的整数代码
-
getDeclaringClass
Class<?> getDeclaringClass()
返回定义了破解方法句柄的基础成员的类。- 结果
- 底层成员的声明类
-
getName
String getName()
返回破解方法句柄的底层成员的名称。 这是"<init>"如果底层成员是构造函数,否则它是一个简单的方法名称或字段名称。- 结果
- 底层成员的简单名称
-
getMethodType
MethodType getMethodType()
返回破解的符号引用的标称类型,表示为方法类型。 如果引用是构造函数,则返回类型将为void。 如果是非静态方法,方法类型不会提及this参数。 如果是一个字段,并且所请求的访问是读取该字段,那么方法类型将没有参数并返回字段类型。 如果是一个字段,并且所请求的访问是写入该字段,则方法类型将具有字段类型的一个参数并返回void。请注意,原始直接方法句柄可能包含一个前导的
this参数,或者(在构造函数的情况下)将用构造的类替换void返回类型。 标称类型不包括任何this参数,(在构造函数的情况下)将返回void。- 结果
- 底层成员的类型,表示为方法类型
-
reflectAs
<T extends Member> T reflectAs(Class<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方法还是构造函数。 这些成员由方法句柄表示,它们是可变量收集器。- 实现要求:
-
这产生的结果相当于:
getReferenceKind() >= REF_invokeVirtual && Modifier.isTransient(getModifiers()) - 结果
-
true当且仅当底层成员被声明为可变的。
-
referenceKindToString
static String referenceKindToString(int referenceKind)
返回给定参考类型的描述性名称,如table above所定义。 常规的前缀“REF_”被省略。- 参数
-
referenceKind- 用于访问类成员的一种引用类型的整数代码 - 结果
-
一个混合大小写的字符串,如
"getField" - 异常
-
IllegalArgumentException- 如果参数不是有效的 reference kind number
-
toString
static String toString(int kind, Class<?> defc, String name, MethodType type)
给出MethodHandleInfo的字符串表示,给出其符号参考的四个部分。 这被定义为是这样的形式的"RK C.N:MT",其中RK是reference kind string为kind,C是name的defcN是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
-
-