@@ -156,90 +156,95 @@ private void registerRuntimeHintsIfNecessary(RegisteredBean registeredBean, Exec
156
156
}
157
157
158
158
private CodeBlock generateCodeForConstructor (RegisteredBean registeredBean , Constructor <?> constructor ) {
159
- String beanName = registeredBean . getBeanName ();
160
- Class <?> beanClass = registeredBean .getBeanClass ();
159
+ ConstructorDescriptor descriptor = new ConstructorDescriptor (
160
+ registeredBean . getBeanName (), constructor , registeredBean .getBeanClass () );
161
161
162
- if (KotlinDetector .isKotlinReflectPresent () && KotlinDelegate .hasConstructorWithOptionalParameter (beanClass )) {
163
- return generateCodeForInaccessibleConstructor (beanName , constructor ,
164
- hints -> hints .registerType (beanClass , MemberCategory .INVOKE_DECLARED_CONSTRUCTORS ));
162
+ Class <?> publicType = descriptor .publicType ();
163
+ if (KotlinDetector .isKotlinReflectPresent () && KotlinDelegate .hasConstructorWithOptionalParameter (publicType )) {
164
+ return generateCodeForInaccessibleConstructor (descriptor ,
165
+ hints -> hints .registerType (publicType , MemberCategory .INVOKE_DECLARED_CONSTRUCTORS ));
165
166
}
166
167
167
168
if (!isVisible (constructor , constructor .getDeclaringClass ())) {
168
- return generateCodeForInaccessibleConstructor (beanName , constructor ,
169
+ return generateCodeForInaccessibleConstructor (descriptor ,
169
170
hints -> hints .registerConstructor (constructor , ExecutableMode .INVOKE ));
170
171
}
171
- return generateCodeForAccessibleConstructor (beanName , constructor );
172
+ return generateCodeForAccessibleConstructor (descriptor );
172
173
}
173
174
174
- private CodeBlock generateCodeForAccessibleConstructor (String beanName , Constructor <?> constructor ) {
175
+ private CodeBlock generateCodeForAccessibleConstructor (ConstructorDescriptor descriptor ) {
176
+ Constructor <?> constructor = descriptor .constructor ();
175
177
this .generationContext .getRuntimeHints ().reflection ().registerType (constructor .getDeclaringClass ());
176
178
177
179
if (constructor .getParameterCount () == 0 ) {
178
180
if (!this .allowDirectSupplierShortcut ) {
179
- return CodeBlock .of ("$T.using($T::new)" , InstanceSupplier .class , constructor . getDeclaringClass ());
181
+ return CodeBlock .of ("$T.using($T::new)" , InstanceSupplier .class , descriptor . actualType ());
180
182
}
181
183
if (!isThrowingCheckedException (constructor )) {
182
- return CodeBlock .of ("$T::new" , constructor . getDeclaringClass ());
184
+ return CodeBlock .of ("$T::new" , descriptor . actualType ());
183
185
}
184
- return CodeBlock .of ("$T.of($T::new)" , ThrowingSupplier .class , constructor . getDeclaringClass ());
186
+ return CodeBlock .of ("$T.of($T::new)" , ThrowingSupplier .class , descriptor . actualType ());
185
187
}
186
188
187
189
GeneratedMethod generatedMethod = generateGetInstanceSupplierMethod (method ->
188
- buildGetInstanceMethodForConstructor (method , beanName , constructor , PRIVATE_STATIC ));
190
+ buildGetInstanceMethodForConstructor (method , descriptor , PRIVATE_STATIC ));
189
191
return generateReturnStatement (generatedMethod );
190
192
}
191
193
192
- private CodeBlock generateCodeForInaccessibleConstructor (String beanName ,
193
- Constructor <?> constructor , Consumer <ReflectionHints > hints ) {
194
+ private CodeBlock generateCodeForInaccessibleConstructor (ConstructorDescriptor descriptor ,
195
+ Consumer <ReflectionHints > hints ) {
194
196
197
+ Constructor <?> constructor = descriptor .constructor ();
195
198
CodeWarnings codeWarnings = new CodeWarnings ();
196
199
codeWarnings .detectDeprecation (constructor .getDeclaringClass (), constructor )
197
200
.detectDeprecation (Arrays .stream (constructor .getParameters ()).map (Parameter ::getType ));
198
201
hints .accept (this .generationContext .getRuntimeHints ().reflection ());
199
202
200
203
GeneratedMethod generatedMethod = generateGetInstanceSupplierMethod (method -> {
201
- method .addJavadoc ("Get the bean instance supplier for '$L'." , beanName );
204
+ method .addJavadoc ("Get the bean instance supplier for '$L'." , descriptor . beanName () );
202
205
method .addModifiers (PRIVATE_STATIC );
203
206
codeWarnings .suppress (method );
204
- method .returns (ParameterizedTypeName .get (BeanInstanceSupplier .class , constructor . getDeclaringClass ()));
205
- method .addStatement (generateResolverForConstructor (constructor ));
207
+ method .returns (ParameterizedTypeName .get (BeanInstanceSupplier .class , descriptor . publicType ()));
208
+ method .addStatement (generateResolverForConstructor (descriptor ));
206
209
});
207
210
208
211
return generateReturnStatement (generatedMethod );
209
212
}
210
213
211
- private void buildGetInstanceMethodForConstructor (MethodSpec .Builder method , String beanName ,
212
- Constructor <?> constructor , javax .lang .model .element .Modifier ... modifiers ) {
214
+ private void buildGetInstanceMethodForConstructor (MethodSpec .Builder method , ConstructorDescriptor descriptor ,
215
+ javax .lang .model .element .Modifier ... modifiers ) {
213
216
214
- Class <?> declaringClass = constructor .getDeclaringClass ();
217
+ Constructor <?> constructor = descriptor .constructor ();
218
+ Class <?> publicType = descriptor .publicType ();
219
+ Class <?> actualType = descriptor .actualType ();
215
220
216
221
CodeWarnings codeWarnings = new CodeWarnings ();
217
- codeWarnings .detectDeprecation (declaringClass , constructor )
222
+ codeWarnings .detectDeprecation (actualType , constructor )
218
223
.detectDeprecation (Arrays .stream (constructor .getParameters ()).map (Parameter ::getType ));
219
- method .addJavadoc ("Get the bean instance supplier for '$L'." , beanName );
224
+ method .addJavadoc ("Get the bean instance supplier for '$L'." , descriptor . beanName () );
220
225
method .addModifiers (modifiers );
221
226
codeWarnings .suppress (method );
222
- method .returns (ParameterizedTypeName .get (BeanInstanceSupplier .class , declaringClass ));
227
+ method .returns (ParameterizedTypeName .get (BeanInstanceSupplier .class , publicType ));
223
228
224
229
CodeBlock .Builder code = CodeBlock .builder ();
225
- code .add (generateResolverForConstructor (constructor ));
230
+ code .add (generateResolverForConstructor (descriptor ));
226
231
boolean hasArguments = constructor .getParameterCount () > 0 ;
227
- boolean onInnerClass = ClassUtils .isInnerClass (declaringClass );
232
+ boolean onInnerClass = ClassUtils .isInnerClass (actualType );
228
233
229
234
CodeBlock arguments = hasArguments ?
230
- new AutowiredArgumentsCodeGenerator (declaringClass , constructor )
235
+ new AutowiredArgumentsCodeGenerator (actualType , constructor )
231
236
.generateCode (constructor .getParameterTypes (), (onInnerClass ? 1 : 0 ))
232
237
: NO_ARGS ;
233
238
234
- CodeBlock newInstance = generateNewInstanceCodeForConstructor (declaringClass , arguments );
239
+ CodeBlock newInstance = generateNewInstanceCodeForConstructor (actualType , arguments );
235
240
code .add (generateWithGeneratorCode (hasArguments , newInstance ));
236
241
method .addStatement (code .build ());
237
242
}
238
243
239
- private CodeBlock generateResolverForConstructor (Constructor <?> constructor ) {
240
- CodeBlock parameterTypes = generateParameterTypesCode (constructor .getParameterTypes ());
244
+ private CodeBlock generateResolverForConstructor (ConstructorDescriptor descriptor ) {
245
+ CodeBlock parameterTypes = generateParameterTypesCode (descriptor . constructor () .getParameterTypes ());
241
246
return CodeBlock .of ("return $T.<$T>forConstructor($L)" , BeanInstanceSupplier .class ,
242
- constructor . getDeclaringClass (), parameterTypes );
247
+ descriptor . publicType (), parameterTypes );
243
248
}
244
249
245
250
private CodeBlock generateNewInstanceCodeForConstructor (Class <?> declaringClass , CodeBlock args ) {
@@ -437,4 +442,11 @@ private void registerProxyIfNecessary(RuntimeHints runtimeHints, DependencyDescr
437
442
}
438
443
}
439
444
445
+ record ConstructorDescriptor (String beanName , Constructor <?> constructor , Class <?> publicType ) {
446
+
447
+ Class <?> actualType () {
448
+ return this .constructor .getDeclaringClass ();
449
+ }
450
+ }
451
+
440
452
}
0 commit comments