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;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具