Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
3.11
-
None
-
None
Description
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):
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; } }