public boolean supports(ParamMetaData metaData) {
   boolean result = metaData.getParamType() == Mvc.class;
   if (result) {
     if (!metaData.getControllerClass().getName().startsWith("com.sinosoft.one.mvc")) {
       throw new IllegalStateException("Mvc is not allowed as a method parameter:" + metaData);
     }
   }
   return result;
 }
 private static boolean addIndexAliasParamNameIfNeccessary(ParamMetaData metaData) {
   Class<?>[] paramTypes = metaData.getMethod().getParameterTypes();
   int index = metaData.getIndex(); // index是从0开始的
   int uriParamIndex = 0; // uriParamIndex,有效的值是从**1**开始的
   int breakIndex = 0; // breakIndex从0开始的
   for (; breakIndex < paramTypes.length && breakIndex <= index; breakIndex++) {
     Class<?> type = paramTypes[breakIndex];
     if (type.isArray()) {
       type = type.getComponentType();
     } else if (Collection.class.isAssignableFrom(type)) {
       Class<?>[] generics = compileGenericParameterTypesDetail(metaData.getMethod(), breakIndex);
       if (generics == null) {
         return false;
       }
       Assert.isTrue(generics.length > 0);
       type = generics[0];
     }
     if (ClassUtils.isPrimitiveOrWrapper(type)
         || type == String.class
         || Date.class.isAssignableFrom(type)) {
       uriParamIndex++;
     }
   }
   if ((breakIndex - 1) == index && uriParamIndex > 0) {
     String alias = "$" + uriParamIndex;
     metaData.addAliasParamName(alias);
     if (logger.isDebugEnabled()) {
       logger.debug(
           "add index alias paramName: '"
               + alias
               + "' for "
               + metaData.getControllerClass().getName()
               + "."
               + metaData.getMethod().getName()
               + "(..."
               + metaData.getParamType()
               + "[index="
               + breakIndex
               + "] ...)");
     }
     return true;
   }
   return false;
 }
 public final boolean supports(ParamMetaData metaData) {
   if (innerSupports(metaData)) {
     Class<?>[] generics =
         compileGenericParameterTypesDetail(metaData.getMethod(), metaData.getIndex());
     if (generics == null || generics.length == 0) {
       throw new IllegalArgumentException(
           "please use generic for "
               + metaData.getParamType().getName()
               + " ["
               + metaData.getControllerClass().getName()
               + "."
               + metaData.getMethod().getName()
               + "]");
     }
     metaData.setUserObject(this, generics[0]);
     return true;
   }
   return false;
 }
 public boolean supports(ParamMetaData metaData) {
   boolean supports =
       Map.class == metaData.getParamType() || HashMap.class == metaData.getParamType();
   if (supports) {
     Class<?>[] generics =
         compileGenericParameterTypesDetail(metaData.getMethod(), metaData.getIndex());
     if (generics == null || generics.length == 0) {
       throw new IllegalArgumentException(
           "please use generic for "
               + metaData.getParamType().getName()
               + " ["
               + metaData.getControllerClass().getName()
               + "."
               + metaData.getMethod().getName()
               + "]");
     }
     metaData.setUserObject(this, generics);
   }
   return supports;
 }