11/*
2- * Copyright 2012-2024 the original author or authors.
2+ * Copyright 2012-2025 the original author or authors.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
5454import org .springframework .aot .hint .MemberCategory ;
5555import org .springframework .aot .hint .RuntimeHints ;
5656import org .springframework .aot .hint .SerializationHints ;
57+ import org .springframework .aot .hint .TypeHint ;
5758import org .springframework .aot .hint .TypeReference ;
5859import org .springframework .aot .hint .predicate .RuntimeHintsPredicates ;
5960import org .springframework .aot .test .generate .TestGenerationContext ;
@@ -149,15 +150,18 @@ void componentModelClassAndSetterParametersAreRegisteredForReflection() {
149150 Model model = new Model ();
150151 model .getSubModels ().add (component );
151152 TestGenerationContext generationContext = applyContribution (model );
153+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
152154 assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (SizeAndTimeBasedRollingPolicy .class ))
153- .accepts (generationContext . getRuntimeHints () );
155+ .accepts (runtimeHints );
154156 assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (FileAppender .class ))
155- .accepts (generationContext .getRuntimeHints ());
156- assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (FileSize .class ))
157- .accepts (generationContext .getRuntimeHints ());
157+ .accepts (runtimeHints );
158+ assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (FileSize .class )).accepts (runtimeHints );
158159 assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (
159160 TimeBasedFileNamingAndTriggeringPolicy .class ))
160- .accepts (generationContext .getRuntimeHints ());
161+ .accepts (runtimeHints );
162+ assertThat (runtimeHints ).satisfies (hasValidTypeName (SizeAndTimeBasedRollingPolicy .class ));
163+ assertThat (runtimeHints ).satisfies (hasValidTypeName (FileSize .class ));
164+ assertThat (runtimeHints ).satisfies (hasValidTypeName (FileAppender .class ));
161165 }
162166
163167 @ Test
@@ -167,12 +171,14 @@ void implicitModelClassAndSetterParametersAreRegisteredForReflection() {
167171 Model model = new Model ();
168172 model .getSubModels ().add (implicit );
169173 TestGenerationContext generationContext = applyContribution (model );
174+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
170175 assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (PatternLayoutEncoder .class ))
171- .accepts (generationContext .getRuntimeHints ());
172- assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Layout .class ))
173- .accepts (generationContext .getRuntimeHints ());
174- assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Charset .class ))
175- .accepts (generationContext .getRuntimeHints ());
176+ .accepts (runtimeHints );
177+ assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Layout .class )).accepts (runtimeHints );
178+ assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Charset .class )).accepts (runtimeHints );
179+ assertThat (runtimeHints ).satisfies (hasValidTypeName (PatternLayoutEncoder .class ));
180+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Layout .class ));
181+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Charset .class ));
176182 }
177183
178184 @ Test
@@ -186,6 +192,8 @@ void componentModelReferencingImportedClassNameIsRegisteredForReflection() {
186192 TestGenerationContext generationContext = applyContribution (model );
187193 assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (SizeAndTimeBasedRollingPolicy .class ))
188194 .accepts (generationContext .getRuntimeHints ());
195+ assertThat (generationContext .getRuntimeHints ())
196+ .satisfies (hasValidTypeName (SizeAndTimeBasedRollingPolicy .class ));
189197 }
190198
191199 @ Test
@@ -196,10 +204,12 @@ void typeFromParentsSetterIsRegisteredForReflection() {
196204 component .setClassName (Outer .class .getName ());
197205 component .getSubModels ().add (implementation );
198206 TestGenerationContext generationContext = applyContribution (component );
199- assertThat ( invokePublicConstructorsAndInspectAndInvokePublicMethodsOf ( Outer . class ))
200- . accepts ( generationContext . getRuntimeHints () );
207+ RuntimeHints runtimeHints = generationContext . getRuntimeHints ();
208+ assertThat ( invokePublicConstructorsAndInspectAndInvokePublicMethodsOf ( Outer . class )). accepts ( runtimeHints );
201209 assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Implementation .class ))
202- .accepts (generationContext .getRuntimeHints ());
210+ .accepts (runtimeHints );
211+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Outer .class ));
212+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Implementation .class ));
203213 }
204214
205215 @ Test
@@ -210,19 +220,28 @@ void typeFromParentsDefaultClassAnnotatedSetterIsRegisteredForReflection() {
210220 component .setClassName (OuterWithDefaultClass .class .getName ());
211221 component .getSubModels ().add (contract );
212222 TestGenerationContext generationContext = applyContribution (component );
223+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
213224 assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (OuterWithDefaultClass .class ))
214- .accepts (generationContext . getRuntimeHints () );
225+ .accepts (runtimeHints );
215226 assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Implementation .class ))
216- .accepts (generationContext .getRuntimeHints ());
227+ .accepts (runtimeHints );
228+ assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (BaseImplementation .Details .class ))
229+ .accepts (runtimeHints );
230+ assertThat (runtimeHints ).satisfies (hasValidTypeName (OuterWithDefaultClass .class ));
231+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Implementation .class ));
232+ assertThat (runtimeHints ).satisfies (hasValidTypeName (BaseImplementation .Details .class ));
217233 }
218234
219235 @ Test
220236 void componentTypesOfArraysAreRegisteredForReflection () {
221237 ComponentModel component = new ComponentModel ();
222238 component .setClassName (ArrayParameters .class .getName ());
223239 TestGenerationContext generationContext = applyContribution (component );
240+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
224241 assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (InetSocketAddress .class ))
225- .accepts (generationContext .getRuntimeHints ());
242+ .accepts (runtimeHints );
243+ assertThat (runtimeHints ).satisfies (hasValidTypeName (InetSocketAddress .class ));
244+ assertThat (runtimeHints ).satisfies (hasValidTypeName (ArrayParameters .class ));
226245 }
227246
228247 @ Test
@@ -231,10 +250,12 @@ void placeholdersInComponentClassAttributeAreReplaced() {
231250 component .setClassName ("${VARIABLE_CLASS_NAME}" );
232251 TestGenerationContext generationContext = applyContribution (component ,
233252 (context ) -> context .putProperty ("VARIABLE_CLASS_NAME" , Outer .class .getName ()));
234- assertThat ( invokePublicConstructorsAndInspectAndInvokePublicMethodsOf ( Outer . class ))
235- . accepts ( generationContext . getRuntimeHints () );
253+ RuntimeHints runtimeHints = generationContext . getRuntimeHints ();
254+ assertThat ( invokePublicConstructorsAndInspectAndInvokePublicMethodsOf ( Outer . class )). accepts ( runtimeHints );
236255 assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Implementation .class ))
237- .accepts (generationContext .getRuntimeHints ());
256+ .accepts (runtimeHints );
257+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Outer .class ));
258+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Implementation .class ));
238259 }
239260
240261 private Predicate <RuntimeHints > invokePublicConstructorsOf (String name ) {
@@ -250,6 +271,12 @@ private Predicate<RuntimeHints> invokePublicConstructorsAndInspectAndInvokePubli
250271 MemberCategory .INVOKE_PUBLIC_METHODS );
251272 }
252273
274+ private Consumer <RuntimeHints > hasValidTypeName (Class <?> type ) {
275+ return (runtimeHints ) -> assertThat (runtimeHints .reflection ().getTypeHint (type )).extracting (TypeHint ::getType )
276+ .extracting (TypeReference ::getName )
277+ .isEqualTo (type .getName ());
278+ }
279+
253280 private Properties load (InputStreamSource source ) {
254281 try (InputStream inputStream = source .getInputStream ()) {
255282 Properties properties = new Properties ();
@@ -323,7 +350,21 @@ public void setContract(Contract contract) {
323350
324351 }
325352
326- public static class Implementation implements Contract {
353+ public static class BaseImplementation implements Contract {
354+
355+ private Details details ;
356+
357+ public void setDetails (Details details ) {
358+ this .details = details ;
359+ }
360+
361+ public static final class Details {
362+
363+ }
364+
365+ }
366+
367+ public static class Implementation extends BaseImplementation {
327368
328369 }
329370
0 commit comments