This commit is contained in:
Stephane Nicoll
2022-08-22 16:27:09 +02:00
parent 4eb84a0537
commit 40de029bf8
12 changed files with 151 additions and 151 deletions

View File

@@ -943,13 +943,13 @@ public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationA
}
private CodeBlock generateMethodCode(RuntimeHints hints) {
CodeBlock.Builder builder = CodeBlock.builder();
CodeBlock.Builder code = CodeBlock.builder();
for (AutowiredElement autowiredElement : this.autowiredElements) {
builder.addStatement(
code.addStatement(
generateMethodStatementForElement(autowiredElement, hints));
}
builder.addStatement("return $L", INSTANCE_PARAMETER);
return builder.build();
code.addStatement("return $L", INSTANCE_PARAMETER);
return code.build();
}
private CodeBlock generateMethodStatementForElement(
@@ -987,20 +987,20 @@ public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationA
private CodeBlock generateMethodStatementForMethod(Method method,
boolean required, RuntimeHints hints) {
CodeBlock.Builder builder = CodeBlock.builder();
builder.add("$T.$L", AutowiredMethodArgumentsResolver.class,
CodeBlock.Builder code = CodeBlock.builder();
code.add("$T.$L", AutowiredMethodArgumentsResolver.class,
(!required) ? "forMethod" : "forRequiredMethod");
builder.add("($S", method.getName());
code.add("($S", method.getName());
if (method.getParameterCount() > 0) {
builder.add(", $L",
code.add(", $L",
generateParameterTypesCode(method.getParameterTypes()));
}
builder.add(")");
code.add(")");
AccessVisibility visibility = AccessVisibility.forMember(method);
if (visibility == AccessVisibility.PRIVATE
|| visibility == AccessVisibility.PROTECTED) {
hints.reflection().registerMethod(method);
builder.add(".resolveAndInvoke($L, $L)", REGISTERED_BEAN_PARAMETER,
code.add(".resolveAndInvoke($L, $L)", REGISTERED_BEAN_PARAMETER,
INSTANCE_PARAMETER);
}
else {
@@ -1009,18 +1009,18 @@ public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationA
method).generateCode(method.getParameterTypes());
CodeBlock injectionCode = CodeBlock.of("args -> $L.$L($L)",
INSTANCE_PARAMETER, method.getName(), arguments);
builder.add(".resolve($L, $L)", REGISTERED_BEAN_PARAMETER, injectionCode);
code.add(".resolve($L, $L)", REGISTERED_BEAN_PARAMETER, injectionCode);
}
return builder.build();
return code.build();
}
private CodeBlock generateParameterTypesCode(Class<?>[] parameterTypes) {
CodeBlock.Builder builder = CodeBlock.builder();
CodeBlock.Builder code = CodeBlock.builder();
for (int i = 0; i < parameterTypes.length; i++) {
builder.add(i != 0 ? ", " : "");
builder.add("$T.class", parameterTypes[i]);
code.add(i != 0 ? ", " : "");
code.add("$T.class", parameterTypes[i]);
}
return builder.build();
return code.build();
}
}

View File

@@ -69,18 +69,18 @@ public class AutowiredArgumentsCodeGenerator {
Assert.notNull(parameterTypes, "'parameterTypes' must not be null");
Assert.notNull(variableName, "'variableName' must not be null");
boolean ambiguous = isAmbiguous();
CodeBlock.Builder builder = CodeBlock.builder();
CodeBlock.Builder code = CodeBlock.builder();
for (int i = startIndex; i < parameterTypes.length; i++) {
builder.add((i != startIndex) ? ", " : "");
code.add((i != startIndex) ? ", " : "");
if (!ambiguous) {
builder.add("$L.get($L)", variableName, i - startIndex);
code.add("$L.get($L)", variableName, i - startIndex);
}
else {
builder.add("$L.get($L, $T.class)", variableName, i - startIndex,
code.add("$L.get($L, $T.class)", variableName, i - startIndex,
parameterTypes[i]);
}
}
return builder.build();
return code.build();
}
private boolean isAmbiguous() {

View File

@@ -109,32 +109,32 @@ class BeanDefinitionPropertiesCodeGenerator {
CodeBlock generateCode(RootBeanDefinition beanDefinition) {
CodeBlock.Builder builder = CodeBlock.builder();
addStatementForValue(builder, beanDefinition, BeanDefinition::isPrimary,
CodeBlock.Builder code = CodeBlock.builder();
addStatementForValue(code, beanDefinition, BeanDefinition::isPrimary,
"$L.setPrimary($L)");
addStatementForValue(builder, beanDefinition, BeanDefinition::getScope,
addStatementForValue(code, beanDefinition, BeanDefinition::getScope,
this::hasScope, "$L.setScope($S)");
addStatementForValue(builder, beanDefinition, BeanDefinition::getDependsOn,
addStatementForValue(code, beanDefinition, BeanDefinition::getDependsOn,
this::hasDependsOn, "$L.setDependsOn($L)", this::toStringVarArgs);
addStatementForValue(builder, beanDefinition, BeanDefinition::isAutowireCandidate,
addStatementForValue(code, beanDefinition, BeanDefinition::isAutowireCandidate,
"$L.setAutowireCandidate($L)");
addStatementForValue(builder, beanDefinition, BeanDefinition::getRole,
addStatementForValue(code, beanDefinition, BeanDefinition::getRole,
this::hasRole, "$L.setRole($L)", this::toRole);
addStatementForValue(builder, beanDefinition, AbstractBeanDefinition::getLazyInit,
addStatementForValue(code, beanDefinition, AbstractBeanDefinition::getLazyInit,
"$L.setLazyInit($L)");
addStatementForValue(builder, beanDefinition, AbstractBeanDefinition::isSynthetic,
addStatementForValue(code, beanDefinition, AbstractBeanDefinition::isSynthetic,
"$L.setSynthetic($L)");
addInitDestroyMethods(builder, beanDefinition, beanDefinition.getInitMethodNames(),
addInitDestroyMethods(code, beanDefinition, beanDefinition.getInitMethodNames(),
"$L.setInitMethodNames($L)");
addInitDestroyMethods(builder, beanDefinition, beanDefinition.getDestroyMethodNames(),
addInitDestroyMethods(code, beanDefinition, beanDefinition.getDestroyMethodNames(),
"$L.setDestroyMethodNames($L)");
addConstructorArgumentValues(builder, beanDefinition);
addPropertyValues(builder, beanDefinition);
addAttributes(builder, beanDefinition);
return builder.build();
addConstructorArgumentValues(code, beanDefinition);
addPropertyValues(code, beanDefinition);
addAttributes(code, beanDefinition);
return code.build();
}
private void addInitDestroyMethods(Builder builder,
private void addInitDestroyMethods(Builder code,
AbstractBeanDefinition beanDefinition, @Nullable String[] methodNames, String format) {
if (!ObjectUtils.isEmpty(methodNames)) {
Class<?> beanType = ClassUtils.getUserClass(beanDefinition.getResolvableType().toClass());
@@ -142,7 +142,7 @@ class BeanDefinitionPropertiesCodeGenerator {
CodeBlock arguments = Arrays.stream(methodNames)
.map(name -> CodeBlock.of("$S", name))
.collect(CodeBlock.joining(", "));
builder.addStatement(format, BEAN_DEFINITION_VARIABLE, arguments);
code.addStatement(format, BEAN_DEFINITION_VARIABLE, arguments);
}
}
@@ -153,7 +153,7 @@ class BeanDefinitionPropertiesCodeGenerator {
}
}
private void addConstructorArgumentValues(CodeBlock.Builder builder,
private void addConstructorArgumentValues(CodeBlock.Builder code,
BeanDefinition beanDefinition) {
Map<Integer, ValueHolder> argumentValues = beanDefinition
@@ -162,18 +162,18 @@ class BeanDefinitionPropertiesCodeGenerator {
argumentValues.forEach((index, valueHolder) -> {
String name = valueHolder.getName();
Object value = valueHolder.getValue();
CodeBlock code = this.customValueCodeGenerator.apply(name, value);
if (code == null) {
code = this.valueCodeGenerator.generateCode(value);
CodeBlock valueCode = this.customValueCodeGenerator.apply(name, value);
if (valueCode == null) {
valueCode = this.valueCodeGenerator.generateCode(value);
}
builder.addStatement(
code.addStatement(
"$L.getConstructorArgumentValues().addIndexedArgumentValue($L, $L)",
BEAN_DEFINITION_VARIABLE, index, code);
BEAN_DEFINITION_VARIABLE, index, valueCode);
});
}
}
private void addPropertyValues(CodeBlock.Builder builder,
private void addPropertyValues(CodeBlock.Builder code,
RootBeanDefinition beanDefinition) {
MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
@@ -181,12 +181,12 @@ class BeanDefinitionPropertiesCodeGenerator {
for (PropertyValue propertyValue : propertyValues) {
String name = propertyValue.getName();
Object value = propertyValue.getValue();
CodeBlock code = this.customValueCodeGenerator.apply(name, value);
if (code == null) {
code = this.valueCodeGenerator.generateCode(value);
CodeBlock valueCode = this.customValueCodeGenerator.apply(name, value);
if (valueCode == null) {
valueCode = this.valueCodeGenerator.generateCode(value);
}
builder.addStatement("$L.getPropertyValues().addPropertyValue($S, $L)",
BEAN_DEFINITION_VARIABLE, propertyValue.getName(), code);
code.addStatement("$L.getPropertyValues().addPropertyValue($S, $L)",
BEAN_DEFINITION_VARIABLE, propertyValue.getName(), valueCode);
}
Class<?> infrastructureType = getInfrastructureType(beanDefinition);
BeanInfo beanInfo = (infrastructureType != Object.class) ? getBeanInfo(infrastructureType) : null;
@@ -235,14 +235,14 @@ class BeanDefinitionPropertiesCodeGenerator {
return Collections.unmodifiableMap(writeMethods);
}
private void addAttributes(CodeBlock.Builder builder, BeanDefinition beanDefinition) {
private void addAttributes(CodeBlock.Builder code, BeanDefinition beanDefinition) {
String[] attributeNames = beanDefinition.attributeNames();
if (!ObjectUtils.isEmpty(attributeNames)) {
for (String attributeName : attributeNames) {
if (this.attributeFilter.test(attributeName)) {
CodeBlock value = this.valueCodeGenerator
.generateCode(beanDefinition.getAttribute(attributeName));
builder.addStatement("$L.setAttribute($S, $L)",
code.addStatement("$L.setAttribute($S, $L)",
BEAN_DEFINITION_VARIABLE, attributeName, value);
}
}
@@ -278,32 +278,32 @@ class BeanDefinitionPropertiesCodeGenerator {
}
private <B extends BeanDefinition, T> void addStatementForValue(
CodeBlock.Builder builder, BeanDefinition beanDefinition,
CodeBlock.Builder code, BeanDefinition beanDefinition,
Function<B, T> getter, String format) {
addStatementForValue(builder, beanDefinition, getter,
addStatementForValue(code, beanDefinition, getter,
(defaultValue, actualValue) -> !Objects.equals(defaultValue, actualValue),
format);
}
private <B extends BeanDefinition, T> void addStatementForValue(
CodeBlock.Builder builder, BeanDefinition beanDefinition,
CodeBlock.Builder code, BeanDefinition beanDefinition,
Function<B, T> getter, BiPredicate<T, T> filter, String format) {
addStatementForValue(builder, beanDefinition, getter, filter, format,
addStatementForValue(code, beanDefinition, getter, filter, format,
actualValue -> actualValue);
}
@SuppressWarnings("unchecked")
private <B extends BeanDefinition, T> void addStatementForValue(
CodeBlock.Builder builder, BeanDefinition beanDefinition,
CodeBlock.Builder code, BeanDefinition beanDefinition,
Function<B, T> getter, BiPredicate<T, T> filter, String format,
Function<T, Object> formatter) {
T defaultValue = getter.apply((B) DEFAULT_BEAN_DEFINITION);
T actualValue = getter.apply((B) beanDefinition);
if (filter.test(defaultValue, actualValue)) {
builder.addStatement(format, BEAN_DEFINITION_VARIABLE,
code.addStatement(format, BEAN_DEFINITION_VARIABLE,
formatter.apply(actualValue));
}
}

View File

@@ -251,11 +251,11 @@ class BeanDefinitionPropertyValueCodeGenerator {
ResolvableType componentType = type.getComponentType();
Stream<CodeBlock> elements = Arrays.stream(ObjectUtils.toObjectArray(value)).map(component ->
BeanDefinitionPropertyValueCodeGenerator.this.generateCode(component, componentType));
CodeBlock.Builder builder = CodeBlock.builder();
builder.add("new $T {", type.toClass());
builder.add(elements.collect(CodeBlock.joining(", ")));
builder.add("}");
return builder.build();
CodeBlock.Builder code = CodeBlock.builder();
code.add("new $T {", type.toClass());
code.add(elements.collect(CodeBlock.joining(", ")));
code.add("}");
return code.build();
}
return null;
}
@@ -298,19 +298,19 @@ class BeanDefinitionPropertyValueCodeGenerator {
protected final CodeBlock generateCollectionOf(Collection<?> collection,
Class<?> collectionType, ResolvableType elementType) {
Builder builder = CodeBlock.builder();
builder.add("$T.of(", collectionType);
Builder code = CodeBlock.builder();
code.add("$T.of(", collectionType);
Iterator<?> iterator = collection.iterator();
while (iterator.hasNext()) {
Object element = iterator.next();
builder.add("$L", BeanDefinitionPropertyValueCodeGenerator.this
code.add("$L", BeanDefinitionPropertyValueCodeGenerator.this
.generateCode(element, elementType));
if (iterator.hasNext()) {
builder.add(", ");
code.add(", ");
}
}
builder.add(")");
return builder.build();
code.add(")");
return code.build();
}
}
@@ -364,22 +364,22 @@ class BeanDefinitionPropertyValueCodeGenerator {
}
ResolvableType keyType = type.as(Map.class).getGeneric(0);
ResolvableType valueType = type.as(Map.class).getGeneric(1);
CodeBlock.Builder builder = CodeBlock.builder();
builder.add("$T.ofEntries(", ManagedMap.class);
CodeBlock.Builder code = CodeBlock.builder();
code.add("$T.ofEntries(", ManagedMap.class);
Iterator<Map.Entry<K, V>> iterator = managedMap.entrySet().iterator();
while (iterator.hasNext()) {
Entry<?, ?> entry = iterator.next();
builder.add("$T.entry($L,$L)", Map.class,
code.add("$T.entry($L,$L)", Map.class,
BeanDefinitionPropertyValueCodeGenerator.this
.generateCode(entry.getKey(), keyType),
BeanDefinitionPropertyValueCodeGenerator.this
.generateCode(entry.getValue(), valueType));
if (iterator.hasNext()) {
builder.add(", ");
code.add(", ");
}
}
builder.add(")");
return builder.build();
code.add(")");
return code.build();
}
}
@@ -451,8 +451,8 @@ class BeanDefinitionPropertyValueCodeGenerator {
}
map = orderForCodeConsistency(map);
boolean useOfEntries = map.size() > 10;
CodeBlock.Builder builder = CodeBlock.builder();
builder.add("$T" + ((!useOfEntries) ? ".of(" : ".ofEntries("), Map.class);
CodeBlock.Builder code = CodeBlock.builder();
code.add("$T" + ((!useOfEntries) ? ".of(" : ".ofEntries("), Map.class);
Iterator<Map.Entry<K, V>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry<K, V> entry = iterator.next();
@@ -461,17 +461,17 @@ class BeanDefinitionPropertyValueCodeGenerator {
CodeBlock valueCode = BeanDefinitionPropertyValueCodeGenerator.this
.generateCode(entry.getValue(), valueType);
if (!useOfEntries) {
builder.add("$L, $L", keyCode, valueCode);
code.add("$L, $L", keyCode, valueCode);
}
else {
builder.add("$T.entry($L,$L)", Map.class, keyCode, valueCode);
code.add("$T.entry($L,$L)", Map.class, keyCode, valueCode);
}
if (iterator.hasNext()) {
builder.add(", ");
code.add(", ");
}
}
builder.add(")");
return builder.build();
code.add(")");
return code.build();
}
private <K, V> Map<K, V> orderForCodeConsistency(Map<K, V> map) {

View File

@@ -80,19 +80,19 @@ class BeanRegistrationCodeGenerator implements BeanRegistrationCode {
}
CodeBlock generateCode(GenerationContext generationContext) {
CodeBlock.Builder builder = CodeBlock.builder();
builder.add(this.codeFragments.generateNewBeanDefinitionCode(generationContext,
CodeBlock.Builder code = CodeBlock.builder();
code.add(this.codeFragments.generateNewBeanDefinitionCode(generationContext,
this.registeredBean.getBeanType(), this));
builder.add(this.codeFragments.generateSetBeanDefinitionPropertiesCode(
code.add(this.codeFragments.generateSetBeanDefinitionPropertiesCode(
generationContext, this, this.registeredBean.getMergedBeanDefinition(),
REJECT_ALL_ATTRIBUTES_FILTER));
CodeBlock instanceSupplierCode = this.codeFragments.generateInstanceSupplierCode(
generationContext, this, this.constructorOrFactoryMethod,
this.instancePostProcessors.isEmpty());
builder.add(this.codeFragments.generateSetBeanInstanceSupplierCode(generationContext,
code.add(this.codeFragments.generateSetBeanInstanceSupplierCode(generationContext,
this, instanceSupplierCode, this.instancePostProcessors));
builder.add(this.codeFragments.generateReturnCode(generationContext, this));
return builder.build();
code.add(this.codeFragments.generateReturnCode(generationContext, this));
return code.build();
}
}

View File

@@ -115,11 +115,11 @@ class DefaultBeanRegistrationCodeFragments extends BeanRegistrationCodeFragments
public CodeBlock generateNewBeanDefinitionCode(GenerationContext generationContext,
ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) {
CodeBlock.Builder builder = CodeBlock.builder();
builder.addStatement(generateBeanTypeCode(beanType));
builder.addStatement("$T $L = new $T($L)", RootBeanDefinition.class,
CodeBlock.Builder code = CodeBlock.builder();
code.addStatement(generateBeanTypeCode(beanType));
code.addStatement("$T $L = new $T($L)", RootBeanDefinition.class,
BEAN_DEFINITION_VARIABLE, RootBeanDefinition.class, BEAN_TYPE_VARIABLE);
return builder.build();
return code.build();
}
private CodeBlock generateBeanTypeCode(ResolvableType beanType) {
@@ -178,23 +178,23 @@ class DefaultBeanRegistrationCodeFragments extends BeanRegistrationCodeFragments
BeanRegistrationCode beanRegistrationCode, CodeBlock instanceSupplierCode,
List<MethodReference> postProcessors) {
CodeBlock.Builder builder = CodeBlock.builder();
CodeBlock.Builder code = CodeBlock.builder();
if (postProcessors.isEmpty()) {
builder.addStatement("$L.setInstanceSupplier($L)", BEAN_DEFINITION_VARIABLE,
code.addStatement("$L.setInstanceSupplier($L)", BEAN_DEFINITION_VARIABLE,
instanceSupplierCode);
return builder.build();
return code.build();
}
builder.addStatement("$T $L = $L",
code.addStatement("$T $L = $L",
ParameterizedTypeName.get(InstanceSupplier.class,
this.registeredBean.getBeanClass()),
INSTANCE_SUPPLIER_VARIABLE, instanceSupplierCode);
for (MethodReference postProcessor : postProcessors) {
builder.addStatement("$L = $L.andThen($L)", INSTANCE_SUPPLIER_VARIABLE,
code.addStatement("$L = $L.andThen($L)", INSTANCE_SUPPLIER_VARIABLE,
INSTANCE_SUPPLIER_VARIABLE, postProcessor.toCodeBlock());
}
builder.addStatement("$L.setInstanceSupplier($L)", BEAN_DEFINITION_VARIABLE,
code.addStatement("$L.setInstanceSupplier($L)", BEAN_DEFINITION_VARIABLE,
INSTANCE_SUPPLIER_VARIABLE);
return builder.build();
return code.build();
}
@Override
@@ -212,9 +212,9 @@ class DefaultBeanRegistrationCodeFragments extends BeanRegistrationCodeFragments
public CodeBlock generateReturnCode(GenerationContext generationContext,
BeanRegistrationCode beanRegistrationCode) {
CodeBlock.Builder builder = CodeBlock.builder();
builder.addStatement("return $L", BEAN_DEFINITION_VARIABLE);
return builder.build();
CodeBlock.Builder code = CodeBlock.builder();
code.addStatement("return $L", BEAN_DEFINITION_VARIABLE);
return code.build();
}
}

View File

@@ -57,13 +57,13 @@ final class ResolvableTypeCodeGenerator {
private static CodeBlock generateCodeWithGenerics(ResolvableType target, Class<?> type) {
ResolvableType[] generics = target.getGenerics();
boolean hasNoNestedGenerics = Arrays.stream(generics).noneMatch(ResolvableType::hasGenerics);
CodeBlock.Builder builder = CodeBlock.builder();
builder.add("$T.forClassWithGenerics($T.class", ResolvableType.class, type);
CodeBlock.Builder code = CodeBlock.builder();
code.add("$T.forClassWithGenerics($T.class", ResolvableType.class, type);
for (ResolvableType generic : generics) {
builder.add(", $L", generateCode(generic, hasNoNestedGenerics));
code.add(", $L", generateCode(generic, hasNoNestedGenerics));
}
builder.add(")");
return builder.build();
code.add(")");
return code.build();
}
}

View File

@@ -219,10 +219,10 @@ class BeanDefinitionMethodGeneratorTests {
GenerationContext generationContext,
ResolvableType beanType,
BeanRegistrationCode beanRegistrationCode) {
CodeBlock.Builder builder = CodeBlock.builder();
builder.addStatement("// I am custom");
builder.add(super.generateNewBeanDefinitionCode(generationContext, beanType, beanRegistrationCode));
return builder.build();
CodeBlock.Builder code = CodeBlock.builder();
code.addStatement("// I am custom");
code.add(super.generateNewBeanDefinitionCode(generationContext, beanType, beanRegistrationCode));
return code.build();
}
};

View File

@@ -551,20 +551,20 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
}
private CodeBlock generateAddPostProcessorCode(Map<String, String> mappings) {
CodeBlock.Builder builder = CodeBlock.builder();
builder.addStatement("$T $L = new $T<>()", STRING_STRING_MAP,
CodeBlock.Builder code = CodeBlock.builder();
code.addStatement("$T $L = new $T<>()", STRING_STRING_MAP,
MAPPINGS_VARIABLE, HashMap.class);
mappings.forEach((type, from) -> builder.addStatement("$L.put($S, $S)",
mappings.forEach((type, from) -> code.addStatement("$L.put($S, $S)",
MAPPINGS_VARIABLE, type, from));
builder.addStatement("$T $L = new $T($T.class)", RootBeanDefinition.class,
code.addStatement("$T $L = new $T($T.class)", RootBeanDefinition.class,
BEAN_DEFINITION_VARIABLE, RootBeanDefinition.class, ImportAwareAotBeanPostProcessor.class);
builder.addStatement("$L.setRole($T.ROLE_INFRASTRUCTURE)",
code.addStatement("$L.setRole($T.ROLE_INFRASTRUCTURE)",
BEAN_DEFINITION_VARIABLE, BeanDefinition.class);
builder.addStatement("$L.setInstanceSupplier(() -> new $T($L))",
code.addStatement("$L.setInstanceSupplier(() -> new $T($L))",
BEAN_DEFINITION_VARIABLE, ImportAwareAotBeanPostProcessor.class, MAPPINGS_VARIABLE);
builder.addStatement("$L.registerBeanDefinition($S, $L)",
code.addStatement("$L.registerBeanDefinition($S, $L)",
BEAN_FACTORY_VARIABLE, BEAN_NAME, BEAN_DEFINITION_VARIABLE);
return builder.build();
return code.build();
}
private Map<String, String> buildImportAwareMappings() {

View File

@@ -80,18 +80,18 @@ class ApplicationContextInitializationCodeGenerator implements BeanFactoryInitia
}
private CodeBlock generateInitializeCode() {
CodeBlock.Builder builder = CodeBlock.builder();
builder.addStatement("$T $L = $L.getDefaultListableBeanFactory()",
CodeBlock.Builder code = CodeBlock.builder();
code.addStatement("$T $L = $L.getDefaultListableBeanFactory()",
DefaultListableBeanFactory.class, BEAN_FACTORY_VARIABLE,
APPLICATION_CONTEXT_VARIABLE);
builder.addStatement("$L.setAutowireCandidateResolver(new $T())",
code.addStatement("$L.setAutowireCandidateResolver(new $T())",
BEAN_FACTORY_VARIABLE, ContextAnnotationAutowireCandidateResolver.class);
builder.addStatement("$L.setDependencyComparator($T.INSTANCE)",
code.addStatement("$L.setDependencyComparator($T.INSTANCE)",
BEAN_FACTORY_VARIABLE, AnnotationAwareOrderComparator.class);
for (MethodReference initializer : this.initializers) {
builder.addStatement(initializer.toInvokeCodeBlock(CodeBlock.of(BEAN_FACTORY_VARIABLE)));
code.addStatement(initializer.toInvokeCodeBlock(CodeBlock.of(BEAN_FACTORY_VARIABLE)));
}
return builder.build();
return code.build();
}
GeneratedClass getGeneratedClass() {

View File

@@ -187,16 +187,16 @@ public final class MethodReference {
private CodeBlock toInvokeCodeBlockForInstance(@Nullable String instanceVariable,
CodeBlock[] arguments) {
CodeBlock.Builder builder = CodeBlock.builder();
CodeBlock.Builder code = CodeBlock.builder();
if (instanceVariable != null) {
builder.add("$L.", instanceVariable);
code.add("$L.", instanceVariable);
}
else if (this.declaringClass != null) {
builder.add("new $T().", this.declaringClass);
code.add("new $T().", this.declaringClass);
}
builder.add("$L", this.methodName);
addArguments(builder, arguments);
return builder.build();
code.add("$L", this.methodName);
addArguments(code, arguments);
return code.build();
}
private CodeBlock toInvokeCodeBlockForStatic(@Nullable String instanceVariable,
@@ -204,21 +204,21 @@ public final class MethodReference {
Assert.isTrue(instanceVariable == null,
"'instanceVariable' must be null for static method references");
CodeBlock.Builder builder = CodeBlock.builder();
builder.add("$T.$L", this.declaringClass, this.methodName);
addArguments(builder, arguments);
return builder.build();
CodeBlock.Builder code = CodeBlock.builder();
code.add("$T.$L", this.declaringClass, this.methodName);
addArguments(code, arguments);
return code.build();
}
private void addArguments(CodeBlock.Builder builder, CodeBlock[] arguments) {
builder.add("(");
private void addArguments(CodeBlock.Builder code, CodeBlock[] arguments) {
code.add("(");
for (int i = 0; i < arguments.length; i++) {
if (i != 0) {
builder.add(", ");
code.add(", ");
}
builder.add(arguments[i]);
code.add(arguments[i]);
}
builder.add(")");
code.add(")");
}
@Override

View File

@@ -70,22 +70,22 @@ class InjectionCodeGenerator {
private CodeBlock generateFieldInjectionCode(Field field, String instanceVariable,
CodeBlock resourceToInject) {
CodeBlock.Builder builder = CodeBlock.builder();
CodeBlock.Builder code = CodeBlock.builder();
AccessVisibility visibility = AccessVisibility.forMember(field);
if (visibility == AccessVisibility.PRIVATE
|| visibility == AccessVisibility.PROTECTED) {
this.hints.reflection().registerField(field);
builder.addStatement("$T field = $T.findField($T.class, $S)", Field.class,
code.addStatement("$T field = $T.findField($T.class, $S)", Field.class,
ReflectionUtils.class, field.getDeclaringClass(), field.getName());
builder.addStatement("$T.makeAccessible($L)", ReflectionUtils.class, "field");
builder.addStatement("$T.setField($L, $L, $L)", ReflectionUtils.class,
code.addStatement("$T.makeAccessible($L)", ReflectionUtils.class, "field");
code.addStatement("$T.setField($L, $L, $L)", ReflectionUtils.class,
"field", instanceVariable, resourceToInject);
}
else {
builder.addStatement("$L.$L = $L", instanceVariable, field.getName(),
code.addStatement("$L.$L = $L", instanceVariable, field.getName(),
resourceToInject);
}
return builder.build();
return code.build();
}
private CodeBlock generateMethodInjectionCode(Method method, String instanceVariable,
@@ -93,24 +93,24 @@ class InjectionCodeGenerator {
Assert.isTrue(method.getParameterCount() == 1,
"Method '" + method.getName() + "' must declare a single parameter");
CodeBlock.Builder builder = CodeBlock.builder();
CodeBlock.Builder code = CodeBlock.builder();
AccessVisibility visibility = AccessVisibility.forMember(method);
if (visibility == AccessVisibility.PRIVATE
|| visibility == AccessVisibility.PROTECTED) {
this.hints.reflection().registerMethod(method);
builder.addStatement("$T method = $T.findMethod($T.class, $S, $T.class)",
code.addStatement("$T method = $T.findMethod($T.class, $S, $T.class)",
Method.class, ReflectionUtils.class, method.getDeclaringClass(),
method.getName(), method.getParameterTypes()[0]);
builder.addStatement("$T.makeAccessible($L)", ReflectionUtils.class,
code.addStatement("$T.makeAccessible($L)", ReflectionUtils.class,
"method");
builder.addStatement("$T.invokeMethod($L, $L, $L)", ReflectionUtils.class,
code.addStatement("$T.invokeMethod($L, $L, $L)", ReflectionUtils.class,
"method", instanceVariable, resourceToInject);
}
else {
builder.addStatement("$L.$L($L)", instanceVariable, method.getName(),
code.addStatement("$L.$L($L)", instanceVariable, method.getName(),
resourceToInject);
}
return builder.build();
return code.build();
}
}