MethodHandles.Lookup.FindVirtual(Class, String, MethodType) 方法

定义

为虚拟方法生成方法句柄。

[Android.Runtime.Register("findVirtual", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public Java.Lang.Invoke.MethodHandle FindVirtual (Java.Lang.Class refc, string name, Java.Lang.Invoke.MethodType type);
[<Android.Runtime.Register("findVirtual", "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
member this.FindVirtual : Java.Lang.Class * string * Java.Lang.Invoke.MethodType -> Java.Lang.Invoke.MethodHandle

参数

refc
Class

从中访问方法的类或接口

name
String

方法的名称

type
MethodType

方法的类型,其中省略了接收方参数

返回

所需方法句柄

属性

注解

为虚拟方法生成方法句柄。 方法句柄的类型将是该方法的类型,前面有接收方类型(通常 refc)。 该方法及其所有参数类型都必须可供查找对象访问。

调用时,句柄会将第一个参数视为接收方,并调度接收方的类型,以确定要输入的方法实现。 (调度操作与由或invokevirtualinvokeinterface指令执行的操作相同。

如果查找类具有访问成员的完全权限,则第一个参数的类型为类型 refc 。 否则,成员必须是 protected ,并且第一个参数的类型将限制为查阅类。

返回的方法句柄将具有 MethodHandle#asVarargsCollector 变量 arity,前提是设置了该方法的变量 arity 修饰符位(0x0080)。

由于指令和方法句柄之间的invokevirtualfindVirtual一般等效性,因此,如果类是MethodHandle和名称字符串invokeinvokeExact,则生成的方法句柄等效于由java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvokerjava.lang.invoke.MethodHandles#invoker MethodHandles.invoker具有相同type参数生成的句柄。

<b>示例:</b><blockquote>

{@code
            import static java.lang.invoke.MethodHandles.*;
            import static java.lang.invoke.MethodType.*;
            ...
            MethodHandle MH_concat = publicLookup().findVirtual(String.class,
              "concat", methodType(String.class, String.class));
            MethodHandle MH_hashCode = publicLookup().findVirtual(Object.class,
              "hashCode", methodType(int.class));
            MethodHandle MH_hashCode_String = publicLookup().findVirtual(String.class,
              "hashCode", methodType(int.class));
            assertEquals("xy", (String) MH_concat.invokeExact("x", "y"));
            assertEquals("xy".hashCode(), (int) MH_hashCode.invokeExact((Object)"xy"));
            assertEquals("xy".hashCode(), (int) MH_hashCode_String.invokeExact("xy"));
            // interface method:
            MethodHandle MH_subSequence = publicLookup().findVirtual(CharSequence.class,
              "subSequence", methodType(CharSequence.class, int.class, int.class));
            assertEquals("def", MH_subSequence.invoke("abcdefghi", 3, 6).toString());
            // constructor "internal method" must be accessed differently:
            MethodType MT_newString = methodType(void.class); //()V for new String()
            try { assertEquals("impossible", lookup()
                    .findVirtual(String.class, "<init>", MT_newString));
             } catch (NoSuchMethodException ex) { } // OK
            MethodHandle MH_newString = publicLookup()
              .findConstructor(String.class, MT_newString);
            assertEquals("", (String) MH_newString.invokeExact());
            }

</blockquote>

适用于 . 的 java.lang.invoke.MethodHandles.Lookup.findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType)Java 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

适用于