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