언어

MethodHandle 클래스

정의

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

[Android.Runtime.Register("java/lang/invoke/MethodHandle", ApiSince=26, DoNotGenerateAcw=true)]
public abstract class MethodHandle : Java.Lang.Object
[<Android.Runtime.Register("java/lang/invoke/MethodHandle", ApiSince=26, DoNotGenerateAcw=true)>]
type MethodHandle = class
    inherit Object
상속
MethodHandle
특성

설명

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다. 이러한 변환은 매우 일반적이며 #asType 변환, #bindTo 삽입, java.lang.invoke.MethodHandles#dropArguments 삭제 및 java.lang.invoke.MethodHandles#filterArguments 대체와 같은 패턴을 포함합니다.

<h1>메서드 핸들 내용</h1> 메서드 핸들은 매개 변수 및 반환 형식에 따라 동적으로 강력하게 형식화됩니다. 기본 메서드의 이름 또는 정의 클래스로 구분되지 않습니다. 메서드 핸들의 고유한 #type 형식 설명자와 일치하는 기호 형식 설명자를 사용하여 메서드 핸들을 호출해야 합니다.

모든 메서드 핸들은 접근자를 통해 해당 형식 설명자를 보고합니다 #type type . 이 형식 설명자는 java.lang.invoke.MethodType MethodType 구조가 일련의 클래스인 개체이며, 그 중 하나는 메서드의 반환 형식(또는 void.class 없는 경우)입니다.

메서드 핸들의 형식은 수락하는 호출 형식 및 해당 호출에 적용되는 변환 종류를 제어합니다.

메서드 핸들에는 호출 #invokeExact invokeExact 된 특수 호출자 메서드 쌍과 #invoke invoke. 두 호출자 메서드는 인수 및 반환 값의 변환에 의해 수정된 대로 메서드 핸들의 기본 메서드, 생성자, 필드 또는 기타 작업에 직접 액세스할 수 있도록 합니다. 두 호출자 모두 메서드 핸들의 고유 형식과 정확히 일치하는 호출을 수락합니다. 일반의 비활성 호출자는 다른 호출 형식의 범위도 허용합니다.

메서드 핸들은 변경할 수 없으며 표시되는 상태가 없습니다. 물론 상태를 나타내는 기본 메서드 또는 데이터에 바인딩할 수 있습니다. Java 메모리 모델과 관련하여 모든 메서드 핸들은 모든 내부 필드가 최종 변수인 것처럼 동작합니다. 즉, 애플리케이션에 표시되는 메서드 핸들은 항상 완전히 구성됩니다. 메서드 핸들이 데이터 경합에서 공유 변수를 통해 게시되는 경우에도 마찬가지입니다.

메서드 핸들은 사용자가 서브클래스할 수 없습니다. 구현은 작업을 통해 MethodHandle 볼 수 있는 내부 서브클래스를 java.lang.Object#getClass Object.getClass 만들거나 만들지 않을 수 있습니다. 프로그래머가 특정 클래스의 메서드 핸들에 대한 결론을 도출해서는 안 됩니다. 메서드 핸들 클래스 계층 구조(있는 경우)가 때때로 또는 다른 공급업체의 구현 간에 변경 될 수 있기 때문에.

<h1>메서드 핸들 컴파일</h1> Java 메서드 호출 식 명명 invokeExact 또는 invoke Java 소스 코드에서 메서드 핸들을 호출할 수 있습니다. 소스 코드의 관점에서 이러한 메서드는 모든 인수를 사용할 수 있으며 그 결과는 모든 반환 형식으로 캐스팅될 수 있습니다. 공식적으로 이 작업은 호출자 메서드 Object 반환 형식 및 가변 arity Object 인수를 제공하여 수행되지만 이러한 호출의 자유를 JVM 실행 스택에 직접 연결하는 em<시그니처 다형성>/em<이라는 >추가 품질이 있습니다.

가상 메서드와 마찬가지로 소스 수준 호출 및 invokeExactinvoke 명령으로 invokevirtual 컴파일합니다. 이례적으로 컴파일러는 실제 인수 형식을 기록해야 하며 인수에 대한 메서드 호출 변환을 수행하지 않을 수 있습니다. 대신 변환되지 않은 자체 형식에 따라 스택에 푸시해야 합니다. 메서드 핸들 개체 자체는 인수 앞에 스택에 푸시됩니다. 그런 다음 컴파일러는 인수 및 반환 형식을 설명하는 기호 형식 설명자를 사용하여 메서드 핸들을 호출합니다.

전체 기호 형식 설명자를 실행하려면 컴파일러에서도 반환 형식을 결정해야 합니다. 이는 메서드 호출 식에 대한 캐스트를 기반으로 합니다. 호출이 있는 경우 또는 Object 호출이 식이거나 호출이 문인 경우 다른 void 경우입니다. 캐스트는 기본 형식일 수 있지만 그렇지 않을 void수 있습니다.

코너 사례로 캐스팅되지 않은 null 인수에는 기호 형식 설명자가 java.lang.Void지정됩니다. null 참조를 제외한 형식의 참조가 없으므로 형식 VoidVoid 의 모호성은 무해합니다.

<h1>메서드 핸들 호출</h1> 명령이 처음 실행될 때 invokevirtual 명령의 이름을 기호적으로 확인하고 메서드 호출이 정적으로 유효한지 확인하여 연결됩니다. 이는 에 대한 호출과 invokeExact.에 대한 호출 invoke 의 경우입니다. 이 경우 컴파일러에서 내보낸 기호 형식 설명자가 올바른 구문을 검사하고 포함된 이름이 확인됩니다. invokevirtual 따라서 기호 형식 설명자가 구문적으로 올바른 형식이고 형식이 존재하는 한 메서드 핸들을 호출하는 명령이 항상 연결됩니다.

invokevirtual 연결 후 실행되면 JVM에서 수신 메서드 핸들의 형식을 먼저 검사하여 기호 형식 설명자와 일치하는지 확인합니다. 형식 일치가 실패하면 호출자가 호출하는 메서드가 호출되는 개별 메서드 핸들에 없음을 의미합니다.

이 invokeExact경우 호출의 형식 설명자(기호 형식 이름을 확인한 후)는 수신 메서드 핸들의 메서드 형식과 정확히 일치해야 합니다. 일반, 무해한 invoke경우 확인된 형식 설명자는 수신기 메서드 #asType asType 에 대한 유효한 인수여야 합니다. 따라서 일반 invoke 은 invokeExact.

형식 일치 후 메서드 핸들의 기본 메서드(또는 다른 동작)를 직접 호출하고 즉시 호출 invokeExact 합니다.

호출자가 지정한 기호 형식 설명자가 메서드 핸들의 고유 형식과 정확히 일치하는 경우 일반 invoke 호출은 호출과 동일하게 invokeExact작동합니다. 형식이 일치하지 invoke 않는 경우 호출하는 것처럼 수신 메서드 핸들의 형식을 조정하여 #asType asType정확히 호출 가능한 메서드 핸들 M2을 가져옵니다. 이렇게 하면 호출자와 호출자 간에 메서드 형식을 보다 강력하게 협상할 수 있습니다.

(<em>Note:</em> 조정된 메서드 핸들 M2 은 직접 관찰할 수 없으므로 구현을 구체화할 필요가 없습니다.)

<h1>호출 검사</h1> 일반적인 프로그램에서는 메서드 핸들 형식 일치가 일반적으로 성공합니다. 그러나 일치가 실패하면 JVM은 직접(있는 경우) 또는 실패한 호출 WrongMethodTypeException (의 경우invokeExactasType)에 의해 간접적으로 throwinvoke됩니다.

따라서 정적으로 형식화된 프로그램에서 링크 오류로 표시될 수 있는 메서드 형식 불일치는 메서드 핸들을 사용하는 프로그램에서 동적 WrongMethodTypeException 으로 표시될 수 있습니다.

메서드 형식은 "live" Class 개체를 포함하므로 메서드 형식 일치는 형식 이름과 클래스 로더를 모두 고려합니다. 따라서 메서드 핸들 M 이 한 클래스 로더에서 만들어지고 다른 L1클래스 로더 L2 에서 사용되는 경우에도 메서드 핸들 호출은 형식이 안전합니다. 해결된 L2대로 호출자의 기호 형식 설명자가 해결된 대로 L1원래 호출 수신자 메서드의 기호 형식 설명자와 일치하기 때문입니다. 해결 L1 방법은 생성되고 해당 형식이 할당되는 경우 발생 M 하며, 해결 L2 방법은 명령이 연결되면 발생합니다 invokevirtual .

형식 설명자 검사 외에도 기본 메서드를 호출하는 메서드 핸들의 기능은 제한되지 않습니다. 메서드 핸들이 해당 메서드에 액세스할 수 있는 클래스에 의해 public이 아닌 메서드에 대해 형성된 경우 해당 메서드에 대한 참조를 수신하는 모든 호출자가 결과 핸들을 임의의 위치에서 사용할 수 있습니다.

리플렉션 메서드가 호출될 때마다 액세스가 검사되는 핵심 리플렉션 API와 달리 메서드 핸들을 만들 때 메서드 핸들 액세스 검사가 수행됩니다. (아래 참조)의 ldc 경우 상수 메서드 핸들의 기반이 되는 상수 풀 항목을 연결하는 과정의 일부로 액세스 검사가 수행됩니다.

따라서 비공용 메서드 또는 비공용 클래스의 메서드에 대한 핸들은 일반적으로 비밀로 유지되어야 합니다. 신뢰할 수 없는 코드에서 사용하는 것이 무해하지 않는 한 신뢰할 수 없는 코드로 전달해서는 안 됩니다.

<h1>메서드 핸들 만들기</h1> Java 코드는 해당 코드에 액세스할 수 있는 메서드, 생성자 또는 필드에 직접 액세스하는 메서드 핸들을 만들 수 있습니다. 이 작업은 예를 들어 정적 메서드 핸들을 가져올 수 있는 리플렉션 기능 기반 API java.lang.invoke.MethodHandles.Lookup MethodHandles.Lookup 를 통해 수행됩니다 java.lang.invoke.MethodHandles.Lookup#findStatic Lookup.findStatic. Core Reflection API 개체의 변환 메서드도 있습니다(예: java.lang.invoke.MethodHandles.Lookup#unreflect Lookup.unreflect.).

클래스 및 문자열과 마찬가지로 액세스 가능한 필드, 메서드 및 생성자에 해당하는 메서드 핸들을 바이트 코드로 로드 ldc 할 상수로 클래스 파일의 상수 풀에서 직접 나타낼 수도 있습니다. 새로운 유형의 상수 풀 항목은 CONSTANT_MethodHandle연결된 CONSTANT_MethodrefCONSTANT_InterfaceMethodref풀 또는 CONSTANT_Fieldref 상수 풀 항목을 직접 참조합니다. (메서드 핸들 상수에 대한 자세한 내용은 Java Virtual Machine 사양의 4.4.8 및 5.4.3.5 섹션을 참조하세요.)

변수 arity 한정자 비트(0x0080)가 있는 메서드 또는 생성자에서 조회 또는 상수 로드에 의해 생성된 메서드 핸들에는 해당 변수의 특성 #asVarargsCollector asVarargsCollector이 있습니다.

메서드 참조는 정적 또는 비정적 메서드를 참조할 수 있습니다. 비정적 경우 메서드 핸들 형식에는 다른 인수 앞에 앞에 추가된 명시적 수신기 인수가 포함됩니다. 메서드 핸들의 형식에서 초기 수신기 인수는 메서드가 처음 요청된 클래스에 따라 입력됩니다. (예: 비정적 메서드 핸들을 통해 ldc가져오는 경우 수신기의 형식은 상수 풀 항목에 명명된 클래스입니다.)

메서드 핸들 상수는 동일한 링크 시간 액세스가 해당 바이트 코드 지침을 확인하고 바이 ldc 트 코드 동작이 이러한 오류를 throw하는 경우 해당 링크 오류를 throw합니다.

이를 위해 보호된 멤버에 대한 액세스는 액세스 클래스 또는 해당 서브클래스 중 하나의 수신기로만 제한되며, 액세스 클래스는 보호된 멤버 정의 클래스의 서브클래스(또는 패키지 형제)여야 합니다. 메서드 참조가 현재 패키지 외부의 보호된 비정적 메서드 또는 클래스 필드를 참조하는 경우 수신기 인수는 액세스 클래스의 형식으로 좁혀지게 됩니다.

가상 메서드에 대한 메서드 핸들이 호출되면 메서드는 항상 수신기에서 조회됩니다(즉, 첫 번째 인수).

특정 가상 메서드 구현에 대한 가상이 아닌 메서드 핸들도 만들 수 있습니다. 수신기 유형에 따라 가상 조회를 수행하지 않습니다. 이러한 메서드 핸들은 동일한 메서드에 대한 invokespecial 명령의 효과를 시뮬레이션합니다.

<h1>사용 예제</h1> 다음은 사용 <의 몇 가지 예입니다. blockquote>

{@code
            Object x, y; String s; int i;
            MethodType mt; MethodHandle mh;
            MethodHandles.Lookup lookup = MethodHandles.lookup();
            // mt is (char,char)String
            mt = MethodType.methodType(String.class, char.class, char.class);
            mh = lookup.findVirtual(String.class, "replace", mt);
            s = (String) mh.invokeExact("daddy",'d','n');
            // invokeExact(Ljava/lang/String;CC)Ljava/lang/String;
            assertEquals(s, "nanny");
            // weakly typed invocation (using MHs.invoke)
            s = (String) mh.invokeWithArguments("sappy", 'p', 'v');
            assertEquals(s, "savvy");
            // mt is (Object[])List
            mt = MethodType.methodType(java.util.List.class, Object[].class);
            mh = lookup.findStatic(java.util.Arrays.class, "asList", mt);
            assert(mh.isVarargsCollector());
            x = mh.invoke("one", "two");
            // invoke(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;
            assertEquals(x, java.util.Arrays.asList("one","two"));
            // mt is (Object,Object,Object)Object
            mt = MethodType.genericMethodType(3);
            mh = mh.asType(mt);
            x = mh.invokeExact((Object)1, (Object)2, (Object)3);
            // invokeExact(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
            assertEquals(x, java.util.Arrays.asList(1,2,3));
            // mt is ()int
            mt = MethodType.methodType(int.class);
            mh = lookup.findVirtual(java.util.List.class, "size", mt);
            i = (int) mh.invokeExact(java.util.Arrays.asList(1,2,3));
            // invokeExact(Ljava/util/List;)I
            assert(i == 3);
            mt = MethodType.methodType(void.class, String.class);
            mh = lookup.findVirtual(java.io.PrintStream.class, "println", mt);
            mh.invokeExact(System.out, "Hello, world.");
            // invokeExact(Ljava/io/PrintStream;Ljava/lang/String;)V
            }

</blockquote> 위의 각 호출 invokeExact 또는 일반 invoke 호출은 다음 주석에 표시된 기호 형식 설명자를 사용하여 단일 invokevirtual 명령을 생성합니다. 이러한 예제에서 도우미 메서드 assertEquals 는 인수를 호출 java.util.Objects#equals(Object,Object) Objects.equals 하고 결과가 true임을 어설션하는 메서드로 간주됩니다.

<h1>Exceptions</h1> 메서드 invokeExact 를 invoke throw하도록 선언되며 메서드 핸들이 throw java.lang.Throwable Throwable할 수 있는 항목에 대한 정적 제한이 없음을 말합니다. JVM은 검사된 예외와 선택되지 않은 예외를 구분하지 않으므로(물론 클래스가 아닌) 바이트 코드 셰이프에 대해 확인된 예외를 호출하는 방법부터 메서드 핸들 호출까지 특별한 영향을 주지 않습니다. 그러나 Java 소스 코드에서 메서드 핸들 호출을 수행하는 메서드는 명시적으로 throwThrowable하거나, 그렇지 않으면 모든 throw 가능 항목을 로컬로 catch해야 하며, 컨텍스트에서 합법적인 메서드만 다시 throw하고, 불법인 메서드를 래핑해야 합니다.

<h1>"sigpoly">서명 다형성</h1> em 서명 다형성invokeExact/eminvoke이라는 용어<>에 의해 비정상적인 컴파일 및 플레인 < 의 > 연결 동작이 참조됩니다. Java 언어 사양에 정의된 대로 서명 다형 메서드는 광범위한 호출 서명 및 반환 형식으로 작동할 수 있는 메서드입니다.

소스 코드에서 서명 다형 메서드에 대한 호출은 요청된 기호 형식 설명자에 관계없이 컴파일됩니다. 평소와 같이 Java 컴파일러는 명명된 메서드에 대해 지정된 기호 형식 설명자를 사용하여 명령을 내 invokevirtual 보낸다. 특이한 부분은 기호 형식 설명자가 메서드 선언이 아닌 실제 인수 및 반환 형식에서 파생된다는 것입니다.

JVM은 서명 다형 호출이 포함된 바이트 코드를 처리할 때 기호 형식 설명자에 관계없이 이러한 호출을 성공적으로 연결합니다. (형식 안전을 유지하기 위해 JVM은 다른 곳에서 설명한 대로 적절한 동적 형식 검사로 이러한 호출을 보호합니다.)

컴파일러 백 엔드를 포함한 바이트코드 생성기는 이러한 메서드에 대해 변환되지 않은 기호 형식 설명자를 내보내야 합니다. 링크 오류를 보고하지 않고 이러한 변환되지 않은 설명자를 수락하려면 기호 링크를 결정하는 도구가 필요합니다.

< >메서드 핸들과 코어 리플렉션 API</h1 간의 h1> 상호 운용은 API에서 java.lang.invoke.MethodHandles.Lookup Lookup 팩터리 메서드를 사용하여 Core Reflection API 개체가 나타내는 모든 클래스 멤버를 동작에 해당하는 메서드 핸들로 변환할 수 있습니다. 예를 들어 리플렉티브 java.lang.reflect.Method Method 는 .를 사용하여 java.lang.invoke.MethodHandles.Lookup#unreflect Lookup.unreflect메서드 핸들로 변환할 수 있습니다. 결과 메서드 핸들은 일반적으로 기본 클래스 멤버에 대한 보다 직접적이고 효율적인 액세스를 제공합니다.

특별한 경우, 핵심 리플렉션 API를 사용하여 이 클래스에서 시그니처 다형 메서드 invokeExact 또는 일반 invoke 을 보는 경우 일반 비 다형 메서드로 표시됩니다. 이 API에서 볼 수 java.lang.Class#getDeclaredMethod Class.getDeclaredMethod있듯이 반사 모양은 해당 API의 특별한 상태에 영향을 받지 않습니다. 예를 들어 이 java.lang.reflect.Method#getModifiers Method.getModifiers 경우 native 및 varargs 비트를 포함하여 유사하게 선언된 메서드에 필요한 한정자 비트를 정확하게 보고합니다.

모든 반영된 메서드와 마찬가지로 이러한 메서드(반영된 경우)는 을 통해 java.lang.reflect.Method#invoke java.lang.reflect.Method.invoke호출될 수 있습니다. 그러나 이러한 반사 호출은 메서드 핸들 호출을 초래하지 않습니다. 이러한 호출은 필수 인수(형식 Object[]의 단일 인수)를 전달한 경우 인수를 무시하고 throw UnsupportedOperationException합니다.

지침은 기호 형식 설명자에서 메서드 핸들을 기본적으로 호출할 수 있으므로 invokevirtual 이 반사 뷰는 바이트 코드를 통해 이러한 메서드의 일반적인 프레젠테이션과 충돌합니다. 따라서 이러한 두 가지 네이티브 메서드는 반사적으로 볼 Class.getDeclaredMethod때 자리 표시자로만 간주될 수 있습니다.

특정 형식 설명자에 대한 호출자 메서드를 가져오려면 사용 java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker하거나 java.lang.invoke.MethodHandles#invoker MethodHandles.invoker. java.lang.invoke.MethodHandles.Lookup#findVirtual Lookup.findVirtual 또한 API는 지정된 형식 설명자에 대해 메서드 핸들을 호출 invokeExact 하거나 일반invoke으로 반환할 수 있습니다.

< >메서드 핸들과 Java 제네릭< 간의 h1 상호 운용성/h1> 메서드 핸들은 Java 제네릭 형식으로 선언된 메서드, 생성자 또는 필드에서 가져올 수 있습니다. 핵심 리플렉션 API와 마찬가지로 메서드 핸들의 형식은 원본 수준 형식의 삭제에서 생성됩니다. 메서드 핸들이 호출될 때 해당 인수의 형식 또는 반환 값 캐스트 형식은 제네릭 형식 또는 형식 인스턴스일 수 있습니다. 이 경우 컴파일러는 명령에 대한 invokevirtual 기호 형식 설명자를 생성할 때 해당 형식을 해당 지우기로 바꿉니다.

메서드 핸들은 함수와 유사한 형식과 매개 변수가 있는 Java 형식 사이에 세 가지 불일치가 있기 때문에 Java 매개 변수가 있는(제네릭) 형식의 측면에서 함수와 유사한 형식을 나타내지 않습니다. <ul><li>메서드 형식은 인수 없음부터 허용되는 최대 인수 수까지 가능한 모든 범위에서 범위가 지정됩니다. 제네릭은 variadic이 아니므로 이를 나타낼 수 없습니다.</li li><>메서드 형식은 제네릭 형식이 범위를 초과할 수 없는 Java 기본 형식의 인수를 지정할 수 있습니다.</li li><>메서드 핸들(결합자)에 대한 상위 순서 함수는 여러 종류의 함수를 포함하여 광범위한 함수 형식에서 제네릭인 경우가 많습니다. Java 형식 매개 변수를 사용하여 이러한 제네릭을 나타내는 것은 불가능합니다.</li></ul>

<h1>"maxarity">Arity limits</h1> JVM은 모든 종류의 모든 메서드 및 생성자에 255개의 누적 인수 절대 제한을 적용합니다. 이 제한은 특정 경우에 <더 제한적으로 나타날 수 있습니다. ul><li>A long 또는 double 인수 개수(기한 제한을 위해)는 두 개의 인수 슬롯으로 표시됩니다. <li>비정적 메서드는 메서드가 호출되는 개체에 대해 추가 인수를 사용합니다. <li>A 생성자는 생성되는 개체에 대해 추가 인수를 사용합니다. <li>메서드 핸들 이후' s invoke 메서드(또는 다른 시그니처 다형 메서드)는 가상이 아니고, 가상이 아닌 수신기 개체 외에도 메서드 핸들 자체에 대한 추가 인수를 사용합니다. </ul> 이러한 제한은 누적 인수에 대한 JVM 제한으로 인해 특정 메서드 핸들을 만들 수 없음을 의미합니다. 예를 들어 정적 JVM 메서드가 정확히 255개의 인수를 허용하는 경우 메서드 핸들을 만들 수 없습니다. 메서드 형식이 불가능한 메서드 핸들을 만들려고 시도하면 IllegalArgumentException. 특히 메서드 핸들' s 형식에는 정확한 최대 255의 진도가 없어야 합니다.

에 대한 java.lang.invoke.MethodHandleJava 설명서

이 페이지의 일부는 만들고 공유한 작업을 기반으로 하며 에 설명된 조건에 따라 사용됩니다.

생성자

속성 Description
MethodHandle(IntPtr, JniHandleOwnership)

기존 Java 개체를 나타내는 관리되는 인스턴스를 만듭니다.

속성

속성 Description
Class

이 Object런타임 클래스를 반환합니다.

(다음에서 상속됨 Object)
Handle

기본 Android 인스턴스에 대한 핸들입니다.

(다음에서 상속됨 Object)
IsVarargsCollector

이 메서드 핸들이 #asVarargsCollector 변수 arity 호출을 지원하는지 여부를 결정합니다.

JniIdentityHashCode

interop 런타임에 의해 이 Java 피어에 할당된 ID 해시 코드를 가져옵니다.

(다음에서 상속됨 Object)
JniManagedPeerState

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)
JniPeerMembers

이 Java 바인딩의 멤버에 액세스하는 데 사용되는 JNI 메타데이터를 가져옵니다.

PeerReference

이 Java 피어에 대한 JNI 개체 참조를 가져옵니다.

(다음에서 상속됨 Object)
ThresholdClass

가상 메서드 디스패치에 사용되는 Java 클래스를 가져옵니다.

ThresholdType

이 Java 바인딩을 선언하는 관리되는 형식을 가져옵니다.

메서드

속성 Description
AsCollector(Class, Int32)

<지정된 수의 후행 위치 인수를 허용하고> 배열 인수로 수집하는 em<배열 수집/em> 메서드 핸들을 만듭니다.

AsCollector(Int32, Class, Int32)

<지정된 위치에서 시작하는 지정된 수의 위치 인수를 수락하고> 배열 인수로 수집하는 em<배열 수집/em> 메서드 핸들을 만듭니다.

AsFixedArity()

현재 메서드 핸들과 <>동일한 em 고정 arity</em> 메서드 핸들을 만듭니다.

AsSpreader(Class, Int32)

<후행 배열 인수를 허용하고> 해당 요소를 위치 인수로 분산하는 em<배열 분산/em> 메서드 핸들을 만듭니다.

AsSpreader(Int32, Class, Int32)

<지정된 위치에서 배열 인수를 수락하고> 해당 요소를 배열 대신 위치 인수로 분산하는 em<배열 분산/em> 메서드 핸들을 만듭니다.

AsType(MethodType)

현재 메서드 핸들의 형식을 새 형식으로 조정하는 어댑터 메서드 핸들을 생성합니다.

AsVarargsCollector(Class)

<임의의 수의 후행 위치 인수를 수락하고 배열 인수로 수집할 수 있는 em>변수 arity</em> 어댑터를 만듭니다.

BindTo(Object)

메서드 핸들을 호출하지 않고 메서드 핸들의 첫 번째 인수에 값을 x 바인딩합니다.

Clone()

이 개체의 복사본을 만들고 반환합니다.

(다음에서 상속됨 Object)
Construct(JniObjectReference, JniObjectReferenceOptions)

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)
Dispose()

이 Java 피어에서 보유한 리소스를 해제합니다.

(다음에서 상속됨 Object)
Dispose(Boolean)

이 Java 피어에서 보유한 리소스를 해제합니다.

(다음에서 상속됨 Object)
DisposeUnlessReferenced()

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)
Equals(Object)

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)
Equals(Object)

다른 개체가 이 개체와 "같음"인지 여부를 나타냅니다.

(다음에서 상속됨 Object)
GetHashCode()

개체에 대한 해시 코드 값을 반환합니다.

(다음에서 상속됨 Object)
Invoke(Object[])

메서드 핸들을 호출하여 호출자 형식 설명자를 허용하고 선택적으로 인수 및 반환 값에 대한 변환을 수행합니다.

InvokeExact(Object[])

호출자 형식 설명자를 허용하지만 정확한 형식 일치가 필요한 메서드 핸들을 호출합니다.

InvokeWithArguments(IList<Object>)

지정된 배열의 인수를 메서드 핸들에 전달하여 형식만 #invoke invoke언급하고 인수 배열의 길이를 나타내는 호출 사이트의 인덱스를 Object 통해 메서드 핸들에 전달하여 가변 arity 호출을 수행합니다.

InvokeWithArguments(Object[])

지정된 목록의 인수를 메서드 핸들에 전달하여 형식만 #invoke invoke언급하고 인수 목록의 길이를 나타내는 호출 사이트의 인 Object 덱스를 통해 메서드 핸들에 전달하여 변수 구문 호출을 수행합니다.

JavaFinalize()
사용되지 않음.

가비지 수집에서 개체에 대한 참조가 더 이상 없다고 판단할 때 개체의 가비지 수집기에서 호출됩니다.

(다음에서 상속됨 Object)
Notify()

이 개체의 모니터에서 대기 중인 단일 스레드를 해제합니다.

(다음에서 상속됨 Object)
NotifyAll()

이 개체의 모니터에서 대기 중인 모든 스레드를 해제합니다.

(다음에서 상속됨 Object)
SetHandle(IntPtr, JniHandleOwnership)

Handle 속성을 설정합니다.

(다음에서 상속됨 Object)
SetPeerReference(JniObjectReference, JniObjectReferenceOptions)

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)
ToArray<T>()

이 Java 배열 래퍼에서 관리되는 배열을 만듭니다.

(다음에서 상속됨 Object)
ToString()

개체의 문자열 표현을 반환합니다.

(다음에서 상속됨 Object)
Type()

이 메서드 핸들의 형식을 보고합니다.

UnregisterFromRuntime()

interop 런타임에서 이 Java 피어의 등록을 취소합니다.

(다음에서 상속됨 Object)
Wait()

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <알림을 받><거나 ><>중단/종료<합니다.>

(다음에서 상속됨 Object)
Wait(Int64, Int32)

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 >중단/<종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다.

(다음에서 상속됨 Object)
Wait(Int64)

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 >중단/<종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다.

(다음에서 상속됨 Object)
WithVarargs(Boolean)

부울 플래그가 true이면 이 메서드 핸들을 #asVarargsCollector 변수 arity로 조정하고, 그렇지 않으면 고정된 #asFixedArity 조정합니다.

명시적 인터페이스 구현

속성 Description
IJavaPeerable.Disposed()

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)
IJavaPeerable.Finalized()

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)
IJavaPeerable.JniObjectReferenceControlBlock

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)
IJavaPeerable.SetJniIdentityHashCode(Int32)

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)
IJavaPeerable.SetPeerReference(JniObjectReference)

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

(다음에서 상속됨 JavaObject)

확장명 메서드

속성 Description
GetJniTypeName(IJavaPeerable)

인스턴스 self형식의 JNI 이름을 가져옵니다.

JavaAs<TResult>(IJavaPeerable)

형식self을 강제 TResult 변환하여 강제 변환이 Java 쪽에서 유효한지 확인합니다.

JavaCast<TResult>(IJavaObject)

Android 런타임 확인 형식 변환을 수행합니다.

JavaCast<TResult>(IJavaObject)

메서드 핸들은 인수 또는 반환 값의 선택적 변환을 사용하여 기본 메서드, 생성자, 필드 또는 유사한 하위 수준 작업에 대한 형식화된 직접 실행 가능 참조입니다.

TryJavaCast<TResult>(IJavaPeerable, TResult)

형식self을 강제 TResult 변환하여 강제 변환이 Java 쪽에서 유효한지 확인합니다.

적용 대상