Spring 系列目录(http://www.javashuo.com/article/p-kqecupyl-bm.html)html
JDK 1.8 以后引入 Parameter 类,能够经过它获取方法中参数的名称。Spring 中也增长了对它的支持 ParameterNameDiscoverer,特别是在 Spring MVC 中大量使用。java
@Test public void testStandardReflectionParameterNameDiscoverer() { ParameterNameDiscoverer discoverer = new StandardReflectionParameterNameDiscoverer(); // discoverer = new LocalVariableTableParameterNameDiscoverer(); // discoverer = new DefaultParameterNameDiscoverer(); Method method = ReflectionUtils.findMethod(InnerClass.class, "method", List.class); String[] actualParams = discoverer.getParameterNames(method); assertThat(actualParams, is(new String[]{"users"})); } public class InnerClass { public void method(@PathVariable("username") @RequestBody final List<Map<String, List<Integer>>> users) { } }
Spring 中经过 ParameterNameDiscoverer 获取方法中参数的名称,它有有两个几个默认的实现。其中:spring
PrioritizedParameterNameDiscoverer
用来管理 Spring 中注册的全部的 ParameterNameDiscoverer 解析器,内部维护了一个 List 集合,只要有解析参数名称成功的就返回,从而保证了优先级顺序。其子类 DefaultParameterNameDiscoverer
默认往这个集合中注册了 KotlinReflectionParameterNameDiscoverer、StandardReflectionParameterNameDiscoverer、LocalVariableTableParameterNameDiscoverer 三个解析器。源码分析
StandardReflectionParameterNameDiscoverer
使用 JDK 的 Parameter 解析参数名称,关于 JDK 中参数解析见 <>。code
LocalVariableTableParameterNameDiscoverer
使用 ASM 类库解析参数名称。htm
ParameterNameDiscoverer 接口以下,用于解析构造器和方法中的参数名称:blog
public interface ParameterNameDiscoverer { String[] getParameterNames(Method method); String[] getParameterNames(Constructor<?> ctor); }
public class StandardReflectionParameterNameDiscoverer implements ParameterNameDiscoverer { public String[] getParameterNames(Method method) { return getParameterNames(method.getParameters()); } public String[] getParameterNames(Constructor<?> ctor) { return getParameterNames(ctor.getParameters()); } // 使用 JDK 自带的 Parameter 解析参数名称 private String[] getParameterNames(Parameter[] parameters) { String[] parameterNames = new String[parameters.length]; for (int i = 0; i < parameters.length; i++) { Parameter param = parameters[i]; if (!param.isNamePresent()) { return null; } parameterNames[i] = param.getName(); } return parameterNames; } }
天天用心记录一点点。内容也许不重要,但习惯很重要!接口