diff --git a/spring-context/src/main/java/org/springframework/context/aot/KotlinReflectionBeanRegistrationAotProcessor.java b/spring-context/src/main/java/org/springframework/context/aot/KotlinReflectionBeanRegistrationAotProcessor.java index 320bde37ff84..48341f736e9c 100644 --- a/spring-context/src/main/java/org/springframework/context/aot/KotlinReflectionBeanRegistrationAotProcessor.java +++ b/spring-context/src/main/java/org/springframework/context/aot/KotlinReflectionBeanRegistrationAotProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -66,6 +66,10 @@ private void registerHints(Class type, RuntimeHints runtimeHints) { if (superClass != null) { registerHints(superClass, runtimeHints); } + Class enclosingClass = type.getEnclosingClass(); + if (enclosingClass != null) { + runtimeHints.reflection().registerType(enclosingClass); + } } } diff --git a/spring-context/src/test/kotlin/org/springframework/context/aot/KotlinReflectionBeanRegistrationAotProcessorTests.kt b/spring-context/src/test/kotlin/org/springframework/context/aot/KotlinReflectionBeanRegistrationAotProcessorTests.kt index fbbb48eccd5d..4252607b5868 100644 --- a/spring-context/src/test/kotlin/org/springframework/context/aot/KotlinReflectionBeanRegistrationAotProcessorTests.kt +++ b/spring-context/src/test/kotlin/org/springframework/context/aot/KotlinReflectionBeanRegistrationAotProcessorTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -66,6 +66,17 @@ class KotlinReflectionBeanRegistrationAotProcessorTests { assertThat(generationContext.runtimeHints.reflection().typeHints()).isEmpty() } + @Test + fun shouldGenerateOuterClassHints() { + process(OuterBean.NestedBean::class.java) + assertThat( + RuntimeHintsPredicates.reflection() + .onType(OuterBean.NestedBean::class.java) + .withMemberCategory(MemberCategory.INTROSPECT_DECLARED_METHODS) + .and(RuntimeHintsPredicates.reflection().onType(OuterBean::class.java)) + ).accepts(generationContext.runtimeHints) + } + private fun process(beanClass: Class<*>) { createContribution(beanClass)?.applyTo(generationContext, Mockito.mock(BeanRegistrationCode::class.java)) } @@ -87,4 +98,8 @@ class KotlinReflectionBeanRegistrationAotProcessorTests { } } + class OuterBean { + class NestedBean + } + }