Richard Eckart de Castilho created LANG-1597:
------------------------------------------------
Summary: Invocation fails because matching varargs method found
but then discarded
Key: LANG-1597
URL: https://issues.apache.org/jira/browse/LANG-1597
Project: Commons Lang
Issue Type: Bug
Components: lang.reflect.*
Affects Versions: 3.11
Reporter: Richard Eckart de Castilho
{{getMatchingAccessibleMethod(Class<?>, String, Class<?>...)}} is able to find
proper match for a method to call but then discards it.
Consider the situation you have a varargs method like {{Baz.foo(X... X)}}. We
call {{getMatchingAccessibleMethod(Baz.class, "foo", z}} where {{z instance of
Z extends Y extends X}}. {{getMatchingAccessibleMethod}} finds {{foo}} as the
candidate, but then discards it because for varargs, it requires either the
argument is directly is of type X or that the supertype of the argument X. It
does not properly check the entire inheritance hierarchy in this code (3.11):
{code}
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;
}
}
{code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)