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)

Reply via email to