in src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java [676:729]
public static Method getMatchingAccessibleMethod(final Class<?> cls,
final String methodName, final Class<?>... parameterTypes) {
try {
final Method method = cls.getMethod(methodName, parameterTypes);
MemberUtils.setAccessibleWorkaround(method);
return method;
} catch (final NoSuchMethodException e) { // NOPMD - Swallow the exception
}
// search through all methods
final Method[] methods = cls.getMethods();
final List<Method> matchingMethods = new ArrayList<>();
for (final Method method : methods) {
// compare name and parameters
if (method.getName().equals(methodName) &&
MemberUtils.isMatchingMethod(method, parameterTypes)) {
matchingMethods.add (method);
}
}
// Sort methods by signature to force deterministic result
matchingMethods.sort(METHOD_BY_SIGNATURE);
Method bestMatch = null;
for (final Method method : matchingMethods) {
// get accessible version of method
final Method accessibleMethod = getAccessibleMethod(method);
if (accessibleMethod != null && (bestMatch == null || MemberUtils.compareMethodFit(
accessibleMethod,
bestMatch,
parameterTypes) < 0)) {
bestMatch = accessibleMethod;
}
}
if (bestMatch != null) {
MemberUtils.setAccessibleWorkaround(bestMatch);
}
if (bestMatch != null && bestMatch.isVarArgs() && bestMatch.getParameterTypes().length > 0 && parameterTypes.length > 0) {
final Class<?>[] methodParameterTypes = bestMatch.getParameterTypes();
final Class<?> methodParameterComponentType = methodParameterTypes[methodParameterTypes.length - 1].getComponentType();
final String methodParameterComponentTypeName = ClassUtils.primitiveToWrapper(methodParameterComponentType).getName();
final Class<?> lastParameterType = parameterTypes[parameterTypes.length - 1];
final String parameterTypeName = (lastParameterType==null) ? null : lastParameterType.getName();
final String parameterTypeSuperClassName = (lastParameterType==null) ? null : lastParameterType.getSuperclass().getName();
if (parameterTypeName!= null && parameterTypeSuperClassName != null && !methodParameterComponentTypeName.equals(parameterTypeName)
&& !methodParameterComponentTypeName.equals(parameterTypeSuperClassName)) {
return null;
}
}
return bestMatch;
}