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

}
复制代码

 

posted @   邓维-java  阅读(1603)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示