You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Richard Eckart de Castilho (Jira)" <ji...@apache.org> on 2020/08/14 00:59:00 UTC

[jira] [Created] (LANG-1597) Invocation fails because matching varargs method found but then discarded

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)