Skip to content

Commit 45cff06

Browse files
wplong11velo
andauthored
Refactor reflective feign (#1821)
* Extract ParseHandlersByName.createMethodHandler Extract the function so that the ParseHandlersByName.apply function is easy to understand. * Refactor ReflectiveFeign.newInstance Extract the function so that the ReflectiveFeign.newInstance function is easy to understand. Co-authored-by: Marvin Froeder <velo@users.noreply.github.com>
1 parent d09b88e commit 45cff06

File tree

1 file changed

+49
-37
lines changed

1 file changed

+49
-37
lines changed

core/src/main/java/feign/ReflectiveFeign.java

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -55,28 +55,18 @@ public <T> T newInstance(Target<T> target) {
5555
public <T> T newInstance(Target<T> target, C requestContext) {
5656
TargetSpecificationVerifier.verify(target);
5757

58-
Map<String, MethodHandler> nameToHandler = targetToHandlersByName.apply(target, requestContext);
59-
Map<Method, MethodHandler> methodToHandler = new LinkedHashMap<Method, MethodHandler>();
60-
List<DefaultMethodHandler> defaultMethodHandlers = new LinkedList<DefaultMethodHandler>();
61-
62-
for (Method method : target.type().getMethods()) {
63-
if (method.getDeclaringClass() == Object.class) {
64-
continue;
65-
} else if (Util.isDefault(method)) {
66-
DefaultMethodHandler handler = new DefaultMethodHandler(method);
67-
defaultMethodHandlers.add(handler);
68-
methodToHandler.put(method, handler);
69-
} else {
70-
methodToHandler.put(method, nameToHandler.get(Feign.configKey(target.type(), method)));
71-
}
72-
}
58+
Map<Method, MethodHandler> methodToHandler =
59+
targetToHandlersByName.apply(target, requestContext);
7360
InvocationHandler handler = factory.create(target, methodToHandler);
7461
T proxy = (T) Proxy.newProxyInstance(target.type().getClassLoader(),
7562
new Class<?>[] {target.type()}, handler);
7663

77-
for (DefaultMethodHandler defaultMethodHandler : defaultMethodHandlers) {
78-
defaultMethodHandler.bindTo(proxy);
64+
for (MethodHandler methodHandler : methodToHandler.values()) {
65+
if (methodHandler instanceof DefaultMethodHandler) {
66+
((DefaultMethodHandler) methodHandler).bindTo(proxy);
67+
}
7968
}
69+
8070
return proxy;
8171
}
8272

@@ -156,31 +146,53 @@ static final class ParseHandlersByName<C> {
156146
this.decoder = checkNotNull(decoder, "decoder");
157147
}
158148

159-
public Map<String, MethodHandler> apply(Target target, C requestContext) {
160-
List<MethodMetadata> metadata = contract.parseAndValidateMetadata(target.type());
161-
Map<String, MethodHandler> result = new LinkedHashMap<String, MethodHandler>();
162-
for (MethodMetadata md : metadata) {
163-
BuildTemplateByResolvingArgs buildTemplate;
164-
if (!md.formParams().isEmpty() && md.template().bodyTemplate() == null) {
165-
buildTemplate =
166-
new BuildFormEncodedTemplateFromArgs(md, encoder, queryMapEncoder, target);
167-
} else if (md.bodyIndex() != null || md.alwaysEncodeBody()) {
168-
buildTemplate = new BuildEncodedTemplateFromArgs(md, encoder, queryMapEncoder, target);
169-
} else {
170-
buildTemplate = new BuildTemplateByResolvingArgs(md, queryMapEncoder, target);
149+
public Map<Method, MethodHandler> apply(Target target, C requestContext) {
150+
final Map<Method, MethodHandler> result = new LinkedHashMap<>();
151+
152+
final List<MethodMetadata> metadataList = contract.parseAndValidateMetadata(target.type());
153+
for (MethodMetadata md : metadataList) {
154+
final Method method = md.method();
155+
if (method.getDeclaringClass() == Object.class) {
156+
continue;
171157
}
172-
if (md.isIgnored()) {
173-
result.put(md.configKey(), args -> {
174-
throw new IllegalStateException(md.configKey() + " is not a method handled by feign");
175-
});
176-
} else {
177-
result.put(md.configKey(),
178-
factory.create(target, md, buildTemplate, options, decoder, errorDecoder,
179-
requestContext));
158+
159+
final MethodHandler handler = createMethodHandler(target, md, requestContext);
160+
result.put(method, handler);
161+
}
162+
163+
for (Method method : target.type().getMethods()) {
164+
if (Util.isDefault(method)) {
165+
final MethodHandler handler = new DefaultMethodHandler(method);
166+
result.put(method, handler);
180167
}
181168
}
169+
182170
return result;
183171
}
172+
173+
private MethodHandler createMethodHandler(final Target<?> target,
174+
final MethodMetadata md,
175+
final C requestContext) {
176+
if (md.isIgnored()) {
177+
return args -> {
178+
throw new IllegalStateException(md.configKey() + " is not a method handled by feign");
179+
};
180+
}
181+
182+
BuildTemplateByResolvingArgs buildTemplate = getBuildTemplate(target, md);
183+
return factory.create(
184+
target, md, buildTemplate, options, decoder, errorDecoder, requestContext);
185+
}
186+
187+
private BuildTemplateByResolvingArgs getBuildTemplate(Target target, MethodMetadata md) {
188+
if (!md.formParams().isEmpty() && md.template().bodyTemplate() == null) {
189+
return new BuildFormEncodedTemplateFromArgs(md, encoder, queryMapEncoder, target);
190+
} else if (md.bodyIndex() != null || md.alwaysEncodeBody()) {
191+
return new BuildEncodedTemplateFromArgs(md, encoder, queryMapEncoder, target);
192+
} else {
193+
return new BuildTemplateByResolvingArgs(md, queryMapEncoder, target);
194+
}
195+
}
184196
}
185197

186198
private static class BuildTemplateByResolvingArgs implements RequestTemplate.Factory {

0 commit comments

Comments
 (0)