다음을 통해 공유


MethodHandle.AsSpreader 메서드

정의

오버로드

AsSpreader(Class, Int32)

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

AsSpreader(Int32, Class, Int32)

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

AsSpreader(Class, Int32)

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

[Android.Runtime.Register("asSpreader", "(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_Ljava_lang_Class_IHandler", ApiSince=26)]
public virtual Java.Lang.Invoke.MethodHandle? AsSpreader (Java.Lang.Class? arrayType, int arrayLength);
[<Android.Runtime.Register("asSpreader", "(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_Ljava_lang_Class_IHandler", ApiSince=26)>]
abstract member AsSpreader : Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
override this.AsSpreader : Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle

매개 변수

arrayType
Class

일반적으로 Object[]스프레드 인수를 추출할 배열 인수의 형식입니다.

arrayLength
Int32

들어오는 배열 인수에서 분산할 인수 수

반환

원래 메서드 핸들을 호출하기 전에 최종 배열 인수를 분산하는 새 메서드 핸들

특성

설명

<후행 배열 인수를 허용하고< 해당 요소를 위치 인수로 분산하는 em>배열 분산/em> 메서드 핸들을 만듭니다. 새 메서드 핸들은 현재 메서드 핸들을 대상으로 조정합니다. 대상 형식의 최종 arrayLength 매개 변수가 형식의 단일 배열 매개 변수로 대체된다는 점을 제외하고 어댑터의 형식은 대상의 형식 arrayType과 동일합니다.

배열 요소 형식이 원래 대상의 해당 인수 형식과 다른 경우 원래 대상은 호출 #asType asType을 통해 배열 요소를 직접 사용하도록 조정됩니다.

어댑터가 호출되면 후행 배열 인수를 각각 대상에 대한 자체 인수로 배열의 요소로 바꿉니다. (인수의 순서는 유지됩니다.) 대상의 후행 매개 변수 형식으로 캐스팅 및/또는 unboxing을 통해 쌍으로 변환됩니다. 마지막으로 대상이 호출됩니다. 대상에서 반환하는 항목은 어댑터에 의해 변경되지 않고 반환됩니다.

대상을 호출하기 전에 어댑터는 배열에 대상 메서드 핸들에 올바른 인수 수를 제공하기에 충분한 요소가 포함되어 있는지 확인합니다. (0 요소가 필요한 경우에도 배열이 null일 수 있습니다.)

어댑터가 호출되면 제공된 array 인수의 길이가 by array.length 또는 arraylength bytecode처럼 쿼리됩니다. 어댑터에서 길이가 0인 후행 배열 인수를 허용하는 경우 제공된 array 인수는 길이가 0인 배열이거나null, 그렇지 않으면 어댑터가 배열 null 이 있으면 throw NullPointerException 하고 배열에 올바른 요소 수가 없으면 throw IllegalArgumentException 합니다.

다음은 배열 분산 메서드 핸들의 몇 가지 간단한 예입니다 <. blockquote>

{@code
            MethodHandle equals = publicLookup()
              .findVirtual(String.class, "equals", methodType(boolean.class, Object.class));
            assert( (boolean) equals.invokeExact("me", (Object)"me"));
            assert(!(boolean) equals.invokeExact("me", (Object)"thee"));
            // spread both arguments from a 2-array:
            MethodHandle eq2 = equals.asSpreader(Object[].class, 2);
            assert( (boolean) eq2.invokeExact(new Object[]{ "me", "me" }));
            assert(!(boolean) eq2.invokeExact(new Object[]{ "me", "thee" }));
            // try to spread from anything but a 2-array:
            for (int n = 0; n <= 10; n++) {
              Object[] badArityArgs = (n == 2 ? new Object[0] : new Object[n]);
              try { assert((boolean) eq2.invokeExact(badArityArgs) && false); }
              catch (IllegalArgumentException ex) { } // OK
            }
            // spread both arguments from a String array:
            MethodHandle eq2s = equals.asSpreader(String[].class, 2);
            assert( (boolean) eq2s.invokeExact(new String[]{ "me", "me" }));
            assert(!(boolean) eq2s.invokeExact(new String[]{ "me", "thee" }));
            // spread second arguments from a 1-array:
            MethodHandle eq1 = equals.asSpreader(Object[].class, 1);
            assert( (boolean) eq1.invokeExact("me", new Object[]{ "me" }));
            assert(!(boolean) eq1.invokeExact("me", new Object[]{ "thee" }));
            // spread no arguments from a 0-array or null:
            MethodHandle eq0 = equals.asSpreader(Object[].class, 0);
            assert( (boolean) eq0.invokeExact("me", (Object)"me", new Object[0]));
            assert(!(boolean) eq0.invokeExact("me", (Object)"thee", (Object[])null));
            // asSpreader and asCollector are approximate inverses:
            for (int n = 0; n <= 2; n++) {
                for (Class<?> a : new Class<?>[]{Object[].class, String[].class, CharSequence[].class}) {
                    MethodHandle equals2 = equals.asSpreader(a, n).asCollector(a, n);
                    assert( (boolean) equals2.invokeWithArguments("me", "me"));
                    assert(!(boolean) equals2.invokeWithArguments("me", "thee"));
                }
            }
            MethodHandle caToString = publicLookup()
              .findStatic(Arrays.class, "toString", methodType(String.class, char[].class));
            assertEquals("[A, B, C]", (String) caToString.invokeExact("ABC".toCharArray()));
            MethodHandle caString3 = caToString.asCollector(char[].class, 3);
            assertEquals("[A, B, C]", (String) caString3.invokeExact('A', 'B', 'C'));
            MethodHandle caToString2 = caString3.asSpreader(char[].class, 2);
            assertEquals("[A, B, C]", (String) caToString2.invokeExact('A', "BC".toCharArray()));
            }

</blockquote>

에 대한 java.lang.invoke.MethodHandle.asSpreader(java.lang.Class<?>, int)Java 설명서

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

적용 대상

AsSpreader(Int32, Class, Int32)

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

[Android.Runtime.Register("asSpreader", "(ILjava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_ILjava_lang_Class_IHandler", ApiSince=33)]
public virtual Java.Lang.Invoke.MethodHandle? AsSpreader (int spreadArgPos, Java.Lang.Class? arrayType, int arrayLength);
[<Android.Runtime.Register("asSpreader", "(ILjava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsSpreader_ILjava_lang_Class_IHandler", ApiSince=33)>]
abstract member AsSpreader : int * Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
override this.AsSpreader : int * Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle

매개 변수

spreadArgPos
Int32

분산이 시작될 인수 목록의 위치(인덱스 0부터 시작)입니다.

arrayType
Class

일반적으로 Object[]스프레드 인수를 추출할 배열 인수의 형식입니다.

arrayLength
Int32

들어오는 배열 인수에서 분산할 인수 수

반환

원래 메서드 핸들을 호출하기 전에 지정된 위치에 배열 인수를 분산하는 새 메서드 핸들

특성

설명

<지정된 위치에서 배열 인수를 수락하고< 해당 요소를 배열 대신 위치 인수로 분산하는 em>배열 분산/em> 메서드 핸들을 만듭니다. 새 메서드 핸들은 현재 메서드 핸들을 대상으로 조정합니다. 어댑터의 형식은 대상 형식과 동일합니다. 단 arrayLength , 0부터 spreadArgPos시작하는 대상 형식의 매개 변수는 형식 arrayType의 단일 배열 매개 변수로 바뀝니다.

이 메서드는 매우 비슷하 #asSpreader(Class, int)게 동작하지만 매개 변수 목록에서 분산이 수행되어야 하는 위치를 나타내는 추가 spreadArgPos 인수를 허용합니다.

9에 추가되었습니다.

에 대한 java.lang.invoke.MethodHandle.asSpreader(int, java.lang.Class<?>, int)Java 설명서

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

적용 대상