code: Object bindAndInvoke(Object o, StaplerRequest req, StaplerResponse rsp, Object... headArgs) throws IllegalAccessException, InvocationTargetException, ServletException {
          Class[] types = getParameterTypes();
          Annotation[][] annotations = getParameterAnnotations();
          String[] parameterNames = getParameterNames();
  
          Object[] arguments = new Object[types.length];
  
          // fill in the first N arguments
          System.arraycopy(headArgs,0,arguments,0,headArgs.length);
  
          try {
              // find the rest of the arguments. either known types, or with annotations
              for( int i=headArgs.length; i<types.length; i++ ) {
                  Class t = types[i];
                  if(t==StaplerRequest.class || t==HttpServletRequest.class) {
                      arguments[i] = req;
                      continue;
                  }
                  if(t==StaplerResponse.class || t==HttpServletResponse.class) {
                      arguments[i] = rsp;
                      continue;
                  }
  
                  // if the databinding method is provided, call that
                  Function binder = PARSE_METHODS.getUnchecked(t);
                  if (binder!=RETURN_NULL) {
                      arguments[i] = binder.bindAndInvoke(null,req,rsp);
                      continue;
                  }
                  
                  arguments[i] = AnnotationHandler.handle(req,annotations[i],
                      i<parameterNames.length ? parameterNames[i] : null,
                      t);
              }
          } catch (IllegalArgumentException e) {
              throw new IllegalArgumentException("Failed to invoke "+getDisplayName(),e);
          }
  
          return invoke(req, rsp, o,arguments);
      }
docs: Use the given arguments as the first N arguments,
  then figure out the rest of the arguments by looking at parameter annotations,
  then finally call {@link #invoke}.