Поделиться через


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). Метод и все его типы аргументов должны быть доступны для объекта подстановки.

При вызове дескриптор будет обрабатывать первый аргумент как приемник и отправлять на тип получателя, чтобы определить, какая реализация метода требуется ввести. (Действие отправки идентично выполнению инструкции invokevirtual или invokeinterface инструкции.)

Первый аргумент будет иметь тип refc , если класс подстановки имеет полные привилегии для доступа к члену. В противном случае член должен быть protected , а первый аргумент будет ограничен типом класса подстановки.

Возвращенный дескриптор метода будет иметь переменную methodHandle#asVarargsCollector, если задана переменная arifier0x0080 () метода.

Из-за общей эквивалентности invokevirtual между инструкциями и дескрипторами методов, созданными с помощью findVirtualкласса MethodHandle и строки invokeExact имени, или invokeрезультирующий дескриптор метода эквивалентен одному, созданному java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker или java.lang.invoke.MethodHandles#invoker MethodHandles.invoker с тем же type аргументом.

<b>Example:</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 для java.lang.invoke.MethodHandles.Lookup.findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType).

Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.

Применяется к