c语言sprint参数,Spring 中参数名称解析 - ParameterNameDiscoverer

Spring 中参数名称解析 - ParameterNameDiscoverer

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

}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值