MethodHandles.Lookup.FindVirtual(Class, String, MethodType) 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
가상 메서드에 대한 메서드 핸들을 생성합니다.
[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
)이 앞에 추가된 메서드의 형식입니다. 메서드와 모든 인수 형식은 조회 개체에 액세스할 수 있어야 합니다.
호출될 때 핸들은 첫 번째 인수를 수신기로 처리하고 받는 사람의 형식을 디스패치하여 입력할 메서드 구현을 결정합니다. (디스패치 작업은 또는 invokeinterface
명령에 의해 invokevirtual
수행되는 작업과 동일합니다.)
조회 클래스에 멤버에 액세스할 수 있는 모든 권한이 있는 경우 첫 번째 인수는 형식 refc
이 됩니다. 그렇지 않으면 멤버가 있어야 protected
하고 첫 번째 인수는 형식에서 조회 클래스로 제한됩니다.
반환된 메서드 핸들은 메서드의 가변 arity 한정자 비트(0x0080
)가 설정된 경우에만 MethodHandle#asVarargsCollector 변수 arity를 갖습니다.
클래스가 있고 이름 문자열 invoke
invokeExact
인 경우 MethodHandle
명령과 메서드 핸들 findVirtual
간의 invokevirtual
일반적인 동등성 때문에 결과 메서드 핸들은 동일한 인수에 의해 java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker
생성되거나 java.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>
이 페이지의 일부는 Android 오픈 소스 프로젝트에서 만들고 공유하고 Creative Commons 2.5 특성 라이선스에 설명된 용어에 따라 사용되는 작업을 기반으로 하는 수정 사항입니다.