Spring 之 ParameterNameDiscoverer 方法参数名称解析


Spring 之 ParameterNameDiscoverer 方法参数名称解析

 

 

1、简介

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

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

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

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

源码如下:

public interface ParameterNameDiscoverer { /** * Return parameter names for a method, or {@code null} if they cannot be determined. * <p>Individual entries in the array may be {@code null} if parameter names are only * available for some parameters of the given method but not for others. However, * it is recommended to use stub parameter names instead wherever feasible. * @param method the method to find parameter names for * @return an array of parameter names if the names can be resolved, * or {@code null} if they cannot */ @Nullable String[] getParameterNames(Method method); /** * Return parameter names for a constructor, or {@code null} if they cannot be determined. * <p>Individual entries in the array may be {@code null} if parameter names are only * available for some parameters of the given constructor but not for others. However, * it is recommended to use stub parameter names instead wherever feasible. * @param ctor the constructor to find parameter names for * @return an array of parameter names if the names can be resolved, * or {@code null} if they cannot */ @Nullable String[] getParameterNames(Constructor<?> ctor); }

 

2、使用示例

/** * @Author dw * @ClassName ParameterDiscoverTest * @Description * @Date 2022/1/10 15:19 * @Version 1.0 */ @SpringBootTest public class ParameterDiscoverTest { @Test public void testParameterNameDiscoverer() { ParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer(); Method method = ReflectionUtils.findMethod(TestController.class, "getParamName", String.class, Integer.class); String[] actualParams = discoverer.getParameterNames(method); for (String actualParam : actualParams) { System.out.println(actualParam); } } public class TestController { public String getParamName(String userName, Integer age) { System.out.println(userName); return userName; } } }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM