zoukankan      html  css  js  c++  java
  • Spring 中参数名称解析

    Spring 中参数名称解析 - ParameterNameDiscoverer

    Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html)

    JDK 1.8 之后引入 Parameter 类,可以通过它获取方法中参数的名称。Spring 中也增加了对它的支持 ParameterNameDiscoverer,特别是在 Spring MVC 中大量使用。

    一、ParameterNameDiscoverer 使用

    @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) {
        }
    }
    

    二、ParameterNameDiscoverer 源码分析

    Spring 中通过 ParameterNameDiscoverer 获取方法中参数的名称,它有有两个几个默认的实现。其中:

    • PrioritizedParameterNameDiscoverer 用来管理 Spring 中注册的所有的 ParameterNameDiscoverer 解析器,内部维护了一个 List 集合,只要有解析参数名称成功的就返回,从而保证了优先级顺序。其子类 DefaultParameterNameDiscoverer 默认往这个集合中注册了 KotlinReflectionParameterNameDiscoverer、StandardReflectionParameterNameDiscoverer、LocalVariableTableParameterNameDiscoverer 三个解析器。

    • StandardReflectionParameterNameDiscoverer 使用 JDK 的 Parameter 解析参数名称,关于 JDK 中参数解析见 <>。

    • LocalVariableTableParameterNameDiscoverer 使用 ASM 类库解析参数名称。

    ParameterNameDiscoverer 接口如下,用于解析构造器和方法中的参数名称:

    public interface ParameterNameDiscoverer {
    	String[] getParameterNames(Method method);
    	String[] getParameterNames(Constructor<?> ctor);
    }
    

    2.1 StandardReflectionParameterNameDiscoverer

    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;
    	}
    }
    

    每天用心记录一点点。内容也许不重要,但习惯很重要!

  • 相关阅读:
    基于html5拖拽api实现列表的拖拽排序
    vue组件keepAlive的使用
    阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)
    element-ui(vue)upload组件的http-request方法的使用
    javascript知识梳理之数据类型
    解决nginx 出现 413:Request Entity Too Large
    git基本命令
    npm源管理
    element-ui的upload组件的clearFiles方法的调用
    vue实例的生命周期
  • 原文地址:https://www.cnblogs.com/binarylei/p/10344283.html
Copyright © 2011-2022 走看看