From c34de54d8a5a242f75c1e9fdbb7d8cbd1c0d7a8b Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Mon, 20 Jun 2022 15:37:17 +0200 Subject: [PATCH] Fix enclosing class in TypeReference for inner type arrays See gh-28664 --- .../aot/hint/ReflectionTypeReference.java | 10 +++++++++- .../aot/hint/ReflectionTypeReferenceTests.java | 17 +++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/aot/hint/ReflectionTypeReference.java b/spring-core/src/main/java/org/springframework/aot/hint/ReflectionTypeReference.java index 14a859b9913..f7a8076728d 100644 --- a/spring-core/src/main/java/org/springframework/aot/hint/ReflectionTypeReference.java +++ b/spring-core/src/main/java/org/springframework/aot/hint/ReflectionTypeReference.java @@ -28,10 +28,18 @@ final class ReflectionTypeReference extends AbstractTypeReference { private final Class type; private ReflectionTypeReference(Class type) { - super(type.getPackageName(), type.getSimpleName(), safeCreate(type.getEnclosingClass())); + super(type.getPackageName(), type.getSimpleName(), safeCreate(getEnclosingClass(type))); this.type = type; } + @Nullable + private static Class getEnclosingClass(Class type) { + if (type.isArray()) { + return type.getComponentType().getEnclosingClass(); + } + return type.getEnclosingClass(); + } + @Nullable private static ReflectionTypeReference safeCreate(@Nullable Class type) { return (type != null ? new ReflectionTypeReference(type) : null); diff --git a/spring-core/src/test/java/org/springframework/aot/hint/ReflectionTypeReferenceTests.java b/spring-core/src/test/java/org/springframework/aot/hint/ReflectionTypeReferenceTests.java index f351f6af23b..73895db9e2d 100644 --- a/spring-core/src/test/java/org/springframework/aot/hint/ReflectionTypeReferenceTests.java +++ b/spring-core/src/test/java/org/springframework/aot/hint/ReflectionTypeReferenceTests.java @@ -28,6 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat; * Tests for {@link ReflectionTypeReference}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class ReflectionTypeReferenceTests { @@ -38,10 +39,22 @@ class ReflectionTypeReferenceTests { } static Stream reflectionTargetNames() { - return Stream.of(Arguments.of(ReflectionTypeReference.of(int.class), "int"), + return Stream.of( + Arguments.of(ReflectionTypeReference.of(int.class), "int"), Arguments.of(ReflectionTypeReference.of(int[].class), "int[]"), Arguments.of(ReflectionTypeReference.of(Integer[].class), "java.lang.Integer[]"), - Arguments.of(ReflectionTypeReference.of(Object[].class), "java.lang.Object[]")); + Arguments.of(ReflectionTypeReference.of(Object[].class), "java.lang.Object[]"), + Arguments.of(ReflectionTypeReference.of(StaticInner.class), "org.springframework.aot.hint.ReflectionTypeReferenceTests$StaticInner"), + Arguments.of(ReflectionTypeReference.of(StaticInner[].class), "org.springframework.aot.hint.ReflectionTypeReferenceTests$StaticInner[]"), + Arguments.of(ReflectionTypeReference.of(Inner.class), "org.springframework.aot.hint.ReflectionTypeReferenceTests$Inner"), + Arguments.of(ReflectionTypeReference.of(Inner[].class), "org.springframework.aot.hint.ReflectionTypeReferenceTests$Inner[]") + ); + } + + static class StaticInner { + } + + class Inner { } }