private List < Object > adjustArgs ( List < String > args , Method m ) { final List < Object > result = new ArrayList < Object > ( ) ; final Class < ? > [ ] types = m . getParameterTypes ( ) ; if ( m . isVarArgs ( ) ) { types [ types . length - 1 ] = types [ types . length - 1 ] . getComponentType ( ) ; if ( ! String . class . isAssignableFrom ( types [ types . length - 1 ] ) ) { throw new CliException ( "Only String varargs is supported." ) ; } types [ types . length - 1 ] = String . class ; } List < Object > varargs = new ArrayList <> ( ) ; for ( int i = 0 ; i < args . size ( ) ; i ++ ) { try { if ( m . isVarArgs ( ) && i >= types . length - 1 ) { varargs . add ( c . convert ( args . get ( i ) , types [ types . length - 1 ] ) ) ; } else { result . add ( c . convert ( args . get ( i ) , types [ i ] ) ) ; } } catch ( ConversionException e ) { throw CliException . WRONG_ARG_TYPE ( getArguments ( ) . get ( i ) . getName ( ) , types [ i ] . getName ( ) , args . get ( i ) ) ; } } if ( m . isVarArgs ( ) ) { result . add ( varargs . toArray ( new String [ 0 ] ) ) ; } return result ; }
Add or remove parameters to fit the method declaration and also convert them to appropriate data type .