[ 
https://issues.apache.org/jira/browse/LANG-1597?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gary D. Gregory resolved LANG-1597.
-----------------------------------
    Fix Version/s: 3.19.0
       Resolution: Fixed

[~rec] 

Fixed in git master and snapshot builds in 
[https://repository.apache.org/content/repositories/snapshots/]

Please verify your use case.

TY!

> 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
>            Priority: Major
>             Fix For: 3.19.0
>
>
> {{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.20.10#820010)

Reply via email to