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