使用ParamNameResolver解析封裝names的map;
方法註釋參數:(@Param("id")Integer id,@Param("lastName")String lastName)
names:{0=id,1=lastName},names在構造器是就確定了
name確定流程:
1.獲取每個標註了Param註解參數的值:id,賦值給name;
2.每次解析一個參數給map中存放信息:(key:參數索引,value:name的值)
name的值:
標註了Param的註解:註解的值
沒有標註:
1.全局配置:useActualParamName(jdk1.8):name=參數名
2.name=map.size():相當於元素的索引
public Object getNamedParams(Object[] args) { final int ParamCount = names.size(); //如果參數爲空直接返回 if (args == null || ParamCount == 0) { return null; //如果只有一個元素並且是沒有Param註解,就直接調用arg[0],單元素直接返回 } else if (!hasParamAnnotation && ParamCount == 1) { return args[names.firstkey()]; //多個元素或者有Param標註 } else { final Map<String, Object> Param = new ParamMap<Object>(); int i = 0; //遍歷names集合:names的values作爲key;names集合的key作爲取值的參考arg[0]:args[1,"Tom"] //比如:{id=args[0]:1,lastName=args[1]:Tom} for (Map.Entry<Integer, String> entry : names.entrySet()) { Param.put(entry.getValue(), args[entry.getkey()]); //額外的將每一個參數也保存在map中,使用心得key:Param1...ParamN //效果有Param註解也已使用#{指定的key}或者#{Param1} final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1); if (!names.containsValue(genericParamName)) { Param.put(genericParamName, args[entry.getkey()]); } i++; } return Param; } }
//確定names public ParamNameResolver(Configuration config, Method method) { //首先拿到所有的參數、註解和標註參數的索引 final Class<?>[] paramTypes = method.getParameterTypes(); final Annotation[][] paramAnnotations = method.getParameterAnnotations(); final SortedMap<Integer, String> map = new TreeMap<Integer, String>(); int paramCount = paramAnnotations.length; // get names from @Param annotations for (int paramIndex = 0; paramIndex < paramCount; paramIndex++) { if (isSpecialParameter(paramTypes[paramIndex])) { // skip special parameters continue; } String name = null; //如果當前參數的註解是param註解就獲取註解的值 for (Annotation annotation : paramAnnotations[paramIndex]) { if (annotation instanceof Param) { hasParamAnnotation = true; name = ((Param) annotation).value(); break; } } if (name == null) { if (config.isUseActualParamName()) { name = getActualParamName(method, paramIndex); } if (name == null) { name = String.valueOf(map.size()); } } map.put(paramIndex, name); } names = Collections.unmodifiableSortedMap(map); }