diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java index bf37cb80888b..051ec108cab5 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java @@ -117,6 +117,7 @@ public MethodExecutor resolve(EvaluationContext context, Object targetObject, St TypeConverter typeConverter = context.getTypeConverter(); Class type = (targetObject instanceof Class ? (Class) targetObject : targetObject.getClass()); ArrayList methods = new ArrayList<>(getMethods(type, targetObject)); + methods.removeIf(method -> !method.getName().equals(name)); // If a filter is registered for this type, call it MethodFilter filter = (this.filters != null ? this.filters.get(type) : null); @@ -160,48 +161,46 @@ else if (m1.isVarArgs() && !m2.isVarArgs()) { boolean multipleOptions = false; for (Method method : methodsToIterate) { - if (method.getName().equals(name)) { - int paramCount = method.getParameterCount(); - List paramDescriptors = new ArrayList<>(paramCount); - for (int i = 0; i < paramCount; i++) { - paramDescriptors.add(new TypeDescriptor(new MethodParameter(method, i))); - } - ReflectionHelper.ArgumentsMatchInfo matchInfo = null; - if (method.isVarArgs() && argumentTypes.size() >= (paramCount - 1)) { - // *sigh* complicated - matchInfo = ReflectionHelper.compareArgumentsVarargs(paramDescriptors, argumentTypes, typeConverter); - } - else if (paramCount == argumentTypes.size()) { - // Name and parameter number match, check the arguments - matchInfo = ReflectionHelper.compareArguments(paramDescriptors, argumentTypes, typeConverter); + int paramCount = method.getParameterCount(); + List paramDescriptors = new ArrayList<>(paramCount); + for (int i = 0; i < paramCount; i++) { + paramDescriptors.add(new TypeDescriptor(new MethodParameter(method, i))); + } + ReflectionHelper.ArgumentsMatchInfo matchInfo = null; + if (method.isVarArgs() && argumentTypes.size() >= (paramCount - 1)) { + // *sigh* complicated + matchInfo = ReflectionHelper.compareArgumentsVarargs(paramDescriptors, argumentTypes, typeConverter); + } + else if (paramCount == argumentTypes.size()) { + // Name and parameter number match, check the arguments + matchInfo = ReflectionHelper.compareArguments(paramDescriptors, argumentTypes, typeConverter); + } + if (matchInfo != null) { + if (matchInfo.isExactMatch()) { + return new ReflectiveMethodExecutor(method, type); } - if (matchInfo != null) { - if (matchInfo.isExactMatch()) { - return new ReflectiveMethodExecutor(method, type); - } - else if (matchInfo.isCloseMatch()) { - if (this.useDistance) { - int matchDistance = ReflectionHelper.getTypeDifferenceWeight(paramDescriptors, argumentTypes); - if (closeMatch == null || matchDistance < closeMatchDistance) { - // This is a better match... - closeMatch = method; - closeMatchDistance = matchDistance; - } - } - else { - // Take this as a close match if there isn't one already - if (closeMatch == null) { - closeMatch = method; - } + else if (matchInfo.isCloseMatch()) { + if (this.useDistance) { + int matchDistance = ReflectionHelper.getTypeDifferenceWeight(paramDescriptors, argumentTypes); + if (closeMatch == null || matchDistance < closeMatchDistance) { + // This is a better match... + closeMatch = method; + closeMatchDistance = matchDistance; } } - else if (matchInfo.isMatchRequiringConversion()) { - if (matchRequiringConversion != null) { - multipleOptions = true; + else { + // Take this as a close match if there isn't one already + if (closeMatch == null) { + closeMatch = method; } - matchRequiringConversion = method; } } + else if (matchInfo.isMatchRequiringConversion()) { + if (matchRequiringConversion != null) { + multipleOptions = true; + } + matchRequiringConversion = method; + } } } if (closeMatch != null) {