|
25 | 25 |
|
26 | 26 | package java.lang.reflect; |
27 | 27 |
|
28 | | -import jdk.internal.reflect.CallerSensitive; |
29 | | -import jdk.internal.reflect.Reflection; |
30 | 28 | import sun.reflect.generics.factory.CoreReflectionFactory; |
31 | 29 | import sun.reflect.generics.factory.GenericsFactory; |
32 | 30 | import sun.reflect.generics.repository.ExecutableRepository; |
|
35 | 33 |
|
36 | 34 | import java.lang.annotation.Annotation; |
37 | 35 | import java.lang.invoke.MethodHandle; |
| 36 | +import java.lang.invoke.MethodHandles; |
38 | 37 | import java.lang.invoke.MethodType; |
39 | | -import java.lang.runtime.Carriers; |
40 | 38 | import java.util.ArrayList; |
41 | 39 | import java.util.Arrays; |
42 | 40 | import java.util.StringJoiner; |
@@ -405,14 +403,14 @@ public Object[] invoke(Object matchCandidate) |
405 | 403 | Method method = getDeclaringClass().getDeclaredMethod(underlyingName, matchCandidate.getClass(), MethodHandle.class); |
406 | 404 | method.setAccessible(override); |
407 | 405 | MethodType bindingMT = MethodType.methodType( |
408 | | - Object.class, |
| 406 | + Object[].class, |
409 | 407 | Arrays.stream(this.getPatternBindings()) |
410 | 408 | .map(PatternBinding::getType) |
411 | 409 | .toArray(Class[]::new) |
412 | 410 | ); |
413 | | - MethodHandle initializingConstructor = Carriers.initializingConstructor(bindingMT); |
| 411 | + MethodHandle pack = CollectHolder.COLLECT_TO_ARRAY.asType(bindingMT); |
414 | 412 |
|
415 | | - return (Object[])Carriers.boxedComponentValueArray(bindingMT).invoke(method.invoke(matchCandidate, matchCandidate, initializingConstructor)); |
| 413 | + return (Object[])method.invoke(matchCandidate, matchCandidate, pack); |
416 | 414 | } catch (Throwable e) { |
417 | 415 | throw new MatchException(e.getMessage(), e); |
418 | 416 | } |
@@ -450,4 +448,20 @@ public AnnotatedType getAnnotatedReturnType() { |
450 | 448 | String getMangledName() { |
451 | 449 | return mangle(this.getDeclaringClass(), Arrays.stream(getPatternBindings()).map(pb -> pb.getType()).toArray(Class[]::new)); |
452 | 450 | } |
| 451 | + |
| 452 | + private static class CollectHolder { |
| 453 | + private static Object[] collect(Object... params) { |
| 454 | + return params; |
| 455 | + } |
| 456 | + |
| 457 | + static final MethodHandle COLLECT_TO_ARRAY; |
| 458 | + |
| 459 | + static { |
| 460 | + try { |
| 461 | + COLLECT_TO_ARRAY = MethodHandles.lookup().findStatic(CollectHolder.class, "collect", MethodType.methodType(Object[].class, Object[].class)); |
| 462 | + } catch (NoSuchMethodException | IllegalAccessException ex) { |
| 463 | + throw new IllegalStateException(ex); |
| 464 | + } |
| 465 | + } |
| 466 | + } |
453 | 467 | } |
0 commit comments