다음을 통해 공유


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)이 앞에 추가된 메서드의 형식입니다. 메서드와 모든 인수 형식은 조회 개체에 액세스할 수 있어야 합니다.

호출될 때 핸들은 첫 번째 인수를 수신기로 처리하고 받는 사람의 형식을 디스패치하여 입력할 메서드 구현을 결정합니다. (디스패치 작업은 또는 invokeinterface 명령에 의해 invokevirtual 수행되는 작업과 동일합니다.)

조회 클래스에 멤버에 액세스할 수 있는 모든 권한이 있는 경우 첫 번째 인수는 형식 refc 이 됩니다. 그렇지 않으면 멤버가 있어야 protected 하고 첫 번째 인수는 형식에서 조회 클래스로 제한됩니다.

반환된 메서드 핸들은 메서드의 가변 arity 한정자 비트(0x0080)가 설정된 경우에만 MethodHandle#asVarargsCollector 변수 arity를 갖습니다.

클래스가 있고 이름 문자열 invokeinvokeExact 인 경우 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>

에 대한 java.lang.invoke.MethodHandles.Lookup.findVirtual(java.lang.Class<?>, java.lang.String, java.lang.invoke.MethodType)Java 설명서

이 페이지의 일부는 Android 오픈 소스 프로젝트에서 만들고 공유하고 Creative Commons 2.5 특성 라이선스에 설명된 용어에 따라 사용되는 작업을 기반으로 하는 수정 사항입니다.

적용 대상