1
1
/*
2
- * Copyright 2012-2023 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.
53
53
import org .springframework .aot .hint .MemberCategory ;
54
54
import org .springframework .aot .hint .RuntimeHints ;
55
55
import org .springframework .aot .hint .SerializationHints ;
56
+ import org .springframework .aot .hint .TypeHint ;
56
57
import org .springframework .aot .hint .TypeReference ;
57
58
import org .springframework .aot .hint .predicate .RuntimeHintsPredicates ;
58
59
import org .springframework .aot .test .generate .TestGenerationContext ;
@@ -115,15 +116,18 @@ void componentModelClassAndSetterParametersAreRegisteredForReflection() {
115
116
Model model = new Model ();
116
117
model .getSubModels ().add (component );
117
118
TestGenerationContext generationContext = applyContribution (model );
119
+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
118
120
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (SizeAndTimeBasedRollingPolicy .class ))
119
- .accepts (generationContext . getRuntimeHints () );
121
+ .accepts (runtimeHints );
120
122
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (FileAppender .class ))
121
- .accepts (generationContext .getRuntimeHints ());
122
- assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (FileSize .class ))
123
- .accepts (generationContext .getRuntimeHints ());
123
+ .accepts (runtimeHints );
124
+ assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (FileSize .class )).accepts (runtimeHints );
124
125
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (
125
126
TimeBasedFileNamingAndTriggeringPolicy .class ))
126
- .accepts (generationContext .getRuntimeHints ());
127
+ .accepts (runtimeHints );
128
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (SizeAndTimeBasedRollingPolicy .class ));
129
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (FileSize .class ));
130
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (FileAppender .class ));
127
131
}
128
132
129
133
@ Test
@@ -133,12 +137,14 @@ void implicitModelClassAndSetterParametersAreRegisteredForReflection() {
133
137
Model model = new Model ();
134
138
model .getSubModels ().add (implicit );
135
139
TestGenerationContext generationContext = applyContribution (model );
140
+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
136
141
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (PatternLayoutEncoder .class ))
137
- .accepts (generationContext .getRuntimeHints ());
138
- assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Layout .class ))
139
- .accepts (generationContext .getRuntimeHints ());
140
- assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Charset .class ))
141
- .accepts (generationContext .getRuntimeHints ());
142
+ .accepts (runtimeHints );
143
+ assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Layout .class )).accepts (runtimeHints );
144
+ assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Charset .class )).accepts (runtimeHints );
145
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (PatternLayoutEncoder .class ));
146
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Layout .class ));
147
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Charset .class ));
142
148
}
143
149
144
150
@ Test
@@ -152,6 +158,8 @@ void componentModelReferencingImportedClassNameIsRegisteredForReflection() {
152
158
TestGenerationContext generationContext = applyContribution (model );
153
159
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (SizeAndTimeBasedRollingPolicy .class ))
154
160
.accepts (generationContext .getRuntimeHints ());
161
+ assertThat (generationContext .getRuntimeHints ())
162
+ .satisfies (hasValidTypeName (SizeAndTimeBasedRollingPolicy .class ));
155
163
}
156
164
157
165
@ Test
@@ -162,10 +170,12 @@ void typeFromParentsSetterIsRegisteredForReflection() {
162
170
component .setClassName (Outer .class .getName ());
163
171
component .getSubModels ().add (implementation );
164
172
TestGenerationContext generationContext = applyContribution (component );
165
- assertThat ( invokePublicConstructorsAndInspectAndInvokePublicMethodsOf ( Outer . class ))
166
- . accepts ( generationContext . getRuntimeHints () );
173
+ RuntimeHints runtimeHints = generationContext . getRuntimeHints ();
174
+ assertThat ( invokePublicConstructorsAndInspectAndInvokePublicMethodsOf ( Outer . class )). accepts ( runtimeHints );
167
175
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Implementation .class ))
168
- .accepts (generationContext .getRuntimeHints ());
176
+ .accepts (runtimeHints );
177
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Outer .class ));
178
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Implementation .class ));
169
179
}
170
180
171
181
@ Test
@@ -176,19 +186,28 @@ void typeFromParentsDefaultClassAnnotatedSetterIsRegisteredForReflection() {
176
186
component .setClassName (OuterWithDefaultClass .class .getName ());
177
187
component .getSubModels ().add (contract );
178
188
TestGenerationContext generationContext = applyContribution (component );
189
+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
179
190
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (OuterWithDefaultClass .class ))
180
- .accepts (generationContext . getRuntimeHints () );
191
+ .accepts (runtimeHints );
181
192
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Implementation .class ))
182
- .accepts (generationContext .getRuntimeHints ());
193
+ .accepts (runtimeHints );
194
+ assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (BaseImplementation .Details .class ))
195
+ .accepts (runtimeHints );
196
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (OuterWithDefaultClass .class ));
197
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Implementation .class ));
198
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (BaseImplementation .Details .class ));
183
199
}
184
200
185
201
@ Test
186
202
void componentTypesOfArraysAreRegisteredForReflection () {
187
203
ComponentModel component = new ComponentModel ();
188
204
component .setClassName (ArrayParameters .class .getName ());
189
205
TestGenerationContext generationContext = applyContribution (component );
206
+ RuntimeHints runtimeHints = generationContext .getRuntimeHints ();
190
207
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (InetSocketAddress .class ))
191
- .accepts (generationContext .getRuntimeHints ());
208
+ .accepts (runtimeHints );
209
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (InetSocketAddress .class ));
210
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (ArrayParameters .class ));
192
211
}
193
212
194
213
@ Test
@@ -197,10 +216,12 @@ void placeholdersInComponentClassAttributeAreReplaced() {
197
216
component .setClassName ("${VARIABLE_CLASS_NAME}" );
198
217
TestGenerationContext generationContext = applyContribution (component ,
199
218
(context ) -> context .putProperty ("VARIABLE_CLASS_NAME" , Outer .class .getName ()));
200
- assertThat ( invokePublicConstructorsAndInspectAndInvokePublicMethodsOf ( Outer . class ))
201
- . accepts ( generationContext . getRuntimeHints () );
219
+ RuntimeHints runtimeHints = generationContext . getRuntimeHints ();
220
+ assertThat ( invokePublicConstructorsAndInspectAndInvokePublicMethodsOf ( Outer . class )). accepts ( runtimeHints );
202
221
assertThat (invokePublicConstructorsAndInspectAndInvokePublicMethodsOf (Implementation .class ))
203
- .accepts (generationContext .getRuntimeHints ());
222
+ .accepts (runtimeHints );
223
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Outer .class ));
224
+ assertThat (runtimeHints ).satisfies (hasValidTypeName (Implementation .class ));
204
225
}
205
226
206
227
private Predicate <RuntimeHints > invokePublicConstructorsOf (String name ) {
@@ -216,6 +237,12 @@ private Predicate<RuntimeHints> invokePublicConstructorsAndInspectAndInvokePubli
216
237
MemberCategory .INVOKE_PUBLIC_METHODS );
217
238
}
218
239
240
+ private Consumer <RuntimeHints > hasValidTypeName (Class <?> type ) {
241
+ return (runtimeHints ) -> assertThat (runtimeHints .reflection ().getTypeHint (type )).extracting (TypeHint ::getType )
242
+ .extracting (TypeReference ::getName )
243
+ .isEqualTo (type .getName ());
244
+ }
245
+
219
246
private Properties load (InputStreamSource source ) {
220
247
try (InputStream inputStream = source .getInputStream ()) {
221
248
Properties properties = new Properties ();
@@ -279,7 +306,21 @@ public void setContract(Contract contract) {
279
306
280
307
}
281
308
282
- public static class Implementation implements Contract {
309
+ public static class BaseImplementation implements Contract {
310
+
311
+ private Details details ;
312
+
313
+ public void setDetails (Details details ) {
314
+ this .details = details ;
315
+ }
316
+
317
+ public static final class Details {
318
+
319
+ }
320
+
321
+ }
322
+
323
+ public static class Implementation extends BaseImplementation {
283
324
284
325
}
285
326
0 commit comments