1
1
/*
2
- * Copyright 2012-2024 the original author or authors.
2
+ * Copyright 2012-2025 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
54
54
import org .springframework .aot .hint .MemberCategory ;
55
55
import org .springframework .aot .hint .RuntimeHints ;
56
56
import org .springframework .aot .hint .SerializationHints ;
57
+ import org .springframework .aot .hint .TypeHint ;
57
58
import org .springframework .aot .hint .TypeReference ;
58
59
import org .springframework .aot .hint .predicate .RuntimeHintsPredicates ;
59
60
import org .springframework .aot .test .generate .TestGenerationContext ;
@@ -149,15 +150,18 @@ void componentModelClassAndSetterParametersAreRegisteredForReflection() {
149
150
Model model = new Model ();
150
151
model .getSubModels ().add (component );
151
152
TestGenerationContext generationContext = applyContribution (model );
153
+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
152
154
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (SizeAndTimeBasedRollingPolicy .class ))
153
- .accepts (generationContext . getRuntimeHints () );
155
+ .accepts (runtimeHints );
154
156
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 );
158
159
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (
159
160
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 ));
161
165
}
162
166
163
167
@ Test
@@ -167,12 +171,14 @@ void implicitModelClassAndSetterParametersAreRegisteredForReflection() {
167
171
Model model = new Model ();
168
172
model .getSubModels ().add (implicit );
169
173
TestGenerationContext generationContext = applyContribution (model );
174
+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
170
175
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 ));
176
182
}
177
183
178
184
@ Test
@@ -186,6 +192,8 @@ void componentModelReferencingImportedClassNameIsRegisteredForReflection() {
186
192
TestGenerationContext generationContext = applyContribution (model );
187
193
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (SizeAndTimeBasedRollingPolicy .class ))
188
194
.accepts (generationContext .getRuntimeHints ());
195
+ assertThat (generationContext .getRuntimeHints ())
196
+ .satisfies (hasValidTypeName (SizeAndTimeBasedRollingPolicy .class ));
189
197
}
190
198
191
199
@ Test
@@ -196,10 +204,12 @@ void typeFromParentsSetterIsRegisteredForReflection() {
196
204
component .setClassName (Outer .class .getName ());
197
205
component .getSubModels ().add (implementation );
198
206
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 );
201
209
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 ));
203
213
}
204
214
205
215
@ Test
@@ -210,19 +220,28 @@ void typeFromParentsDefaultClassAnnotatedSetterIsRegisteredForReflection() {
210
220
component .setClassName (OuterWithDefaultClass .class .getName ());
211
221
component .getSubModels ().add (contract );
212
222
TestGenerationContext generationContext = applyContribution (component );
223
+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
213
224
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (OuterWithDefaultClass .class ))
214
- .accepts (generationContext . getRuntimeHints () );
225
+ .accepts (runtimeHints );
215
226
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 ));
217
233
}
218
234
219
235
@ Test
220
236
void componentTypesOfArraysAreRegisteredForReflection () {
221
237
ComponentModel component = new ComponentModel ();
222
238
component .setClassName (ArrayParameters .class .getName ());
223
239
TestGenerationContext generationContext = applyContribution (component );
240
+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
224
241
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 ));
226
245
}
227
246
228
247
@ Test
@@ -231,10 +250,12 @@ void placeholdersInComponentClassAttributeAreReplaced() {
231
250
component .setClassName ("${VARIABLE_CLASS_NAME}" );
232
251
TestGenerationContext generationContext = applyContribution (component ,
233
252
(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 );
236
255
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 ));
238
259
}
239
260
240
261
private Predicate <RuntimeHints > invokePublicConstructorsOf (String name ) {
@@ -250,6 +271,12 @@ private Predicate<RuntimeHints> invokePublicConstructorsAndInspectAndInvokePubli
250
271
MemberCategory .INVOKE_PUBLIC_METHODS );
251
272
}
252
273
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
+
253
280
private Properties load (InputStreamSource source ) {
254
281
try (InputStream inputStream = source .getInputStream ()) {
255
282
Properties properties = new Properties ();
@@ -323,7 +350,18 @@ public void setContract(Contract contract) {
323
350
324
351
}
325
352
326
- public static class Implementation implements Contract {
353
+ public static class BaseImplementation implements Contract {
354
+
355
+ public void setDetails (Details details ) {
356
+ }
357
+
358
+ public static final class Details {
359
+
360
+ }
361
+
362
+ }
363
+
364
+ public static class Implementation extends BaseImplementation {
327
365
328
366
}
329
367
0 commit comments