in src/main/java/org/apache/commons/ognl/OgnlRuntime.java [844:936]
public static Object callAppropriateMethod( OgnlContext context, Object source, Object target, String methodName,
String propertyName, List<Method> methods, Object[] args )
throws MethodFailedException
{
Throwable cause = null;
Object[] actualArgs = new Object[args.length];
try
{
Method method = getAppropriateMethod( context, source, target, propertyName, methods, args, actualArgs );
if ( ( method == null ) || !isMethodAccessible( context, source, method, propertyName ) )
{
StringBuilder buffer = new StringBuilder();
String className = "";
if ( target != null )
{
className = target.getClass().getName() + ".";
}
for ( int i = 0, ilast = args.length - 1; i <= ilast; i++ )
{
Object arg = args[i];
buffer.append( ( arg == null ) ? NULL_STRING : arg.getClass().getName() );
if ( i < ilast )
{
buffer.append( ", " );
}
}
throw new NoSuchMethodException( className + methodName + "(" + buffer + ")" );
}
Object[] convertedArgs = actualArgs;
if ( method.isVarArgs() )
{
Class<?>[] parmTypes = method.getParameterTypes();
// split arguments in to two dimensional array for varargs reflection invocation
// where it is expected that the parameter passed in to invoke the method
// will look like "new Object[] { arrayOfNonVarArgsArguments, arrayOfVarArgsArguments }"
for ( int i = 0; i < parmTypes.length; i++ )
{
if ( parmTypes[i].isArray() )
{
convertedArgs = new Object[i + 1];
System.arraycopy( actualArgs, 0, convertedArgs, 0, convertedArgs.length );
Object[] varArgs;
// if they passed in varargs arguments grab them and dump in to new varargs array
if ( actualArgs.length > i )
{
List<Object> varArgsList = new ArrayList<Object>();
for ( int j = i; j < actualArgs.length; j++ )
{
if ( actualArgs[j] != null )
{
varArgsList.add( actualArgs[j] );
}
}
varArgs = varArgsList.toArray();
}
else
{
varArgs = new Object[0];
}
convertedArgs[i] = varArgs;
break;
}
}
}
return invokeMethod( target, method, convertedArgs );
}
catch ( NoSuchMethodException | IllegalAccessException e )
{
cause = e;
} catch ( InvocationTargetException e )
{
cause = e.getTargetException();
}
throw new MethodFailedException( source, methodName, cause );
}