Module  java.base
软件包  java.lang.invoke

Interface MethodHandleInfo



  • public interface MethodHandleInfo
    通过将直接方法句柄破解成其宪法符号部分获得的象征性参考。 要破解直接方法句柄,请致电Lookup.revealDirect

    直接方法句柄

    直接方法句柄表示一个方法,构造函数或字段,没有任何介入参数绑定或其他转换。 直接方法句柄引用的方法,构造函数或字段称为其基础成员 可以通过以下任何方式获得直接方法句柄:

    开裂限制

    给定一个合适的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 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*);
    从以下版本开始:
    1.8
    • 方法详细信息

      • 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)
        将基础成员反映为方法,构造函数或字段对象。 如果基础构件是公开的,它被反射,好像被getMethodgetConstructor ,或getField 否则,它被反映为如果由getDeclaredMethodgetDeclaredConstructor ,或getDeclaredField 给定的查找对象必须可访问底层成员。
        参数类型
        T - 所需类型的结果, Member或子类型
        参数
        expected - 表示所需结果类型的类对象 T
        lookup - 创建此MethodHandleInfo或具有等效访问权限的查找对象
        结果
        对方法,构造函数或字段对象的引用
        异常
        ClassCastException - 如果成员不是预期类型
        NullPointerException - 如果任一参数是 null
        IllegalArgumentException - 如果基础成员不可访问给定的查找对象
      • 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