Java反射获取方法参数名
正常环境下,获取不到参数的名称,使用java反射时,第一个参数名是arg0,第二个参数是arg1,与我们代码中写的对不上。
java反射过程中,需要我们做好判断:
if(!parameter.isNamePresent()){
// 这个 if 分支下,无法从 class 文件获取正确的参数名,这与jdk版本、环境配置有关
// do nothing
} else {
// 这个分支下,是可以正常获取参数名的
System.out.println(parameter.getName());
}
方案一
自java8开始,可以通过反射得到方法的参数名,不过这有个条件:你必须手动在编译时开启-parameters 参数。
以IDEA为例,你需要在Preferences->Build,Execution,Deployment->Compiler->java Compiler 页面添加该编译选项。
(具体可以查阅其他博主的文章,因为基本不用,这里就不啰嗦了)。
方案二
简单的做法:直接使用 spring 提供的工具类,这也是我使用的方法。
/**
* Spring自带的参数提取工具类
*/
private static final DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer(); /**
* 获取参数名
*
* @param method 方法
* @return 参数名
*/
@Nullable
public static String[] getParameterNames(Method method) {
return discoverer.getParameterNames(method);
} /**
* 获取参数名
*
* @param ctor 构造函数
* @return 参数名
*/
@Nullable
public static String[] getParameterNames(Constructor<?> ctor) {
return discoverer.getParameterNames(ctor);
}
简单看一下源码,就能知道他们做了很多兼容设置,各种环境下都是适用的。

方案三
当然,你可能想秀一下,要自己写,这时候就可以用一些“java字节码操作与分析”的类库,例如:javassist、asm。
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.29.2-GA</version>
</dependency>
// javassist 获取参数名
ClassPool classPool = ClassPool.getDefault();
CtClass ctClass = classPool.get("cn.seaboot.postman.debug.AppInfoCtrl");
CtMethod ctMethod = ctClass.getDeclaredMethod("saveInfo"); MethodInfo methodInfo = ctMethod.getMethodInfo();
CodeAttribute attribute = methodInfo.getCodeAttribute(); LocalVariableAttribute attr = (LocalVariableAttribute) attribute.getAttribute(LocalVariableAttribute.tag);
// 获取第一个参数的名称
System.out.println(attr.variableName(1));
Java反射获取方法参数名的更多相关文章
- Java反射获取方法参数名 IDEA配置 Maven
默认情况下无法获得具体的参数名,只能得到arg0, arg1等. 进行如下配置即可通过反射获得具体的参数名. -parameters 如果是Maven项目,还需要在pom.xml文件中增加如下配置 & ...
- Java获取方法参数名、Spring SpEL解析
@Test public void testParse() { //表达式解析 ExpressionParser expressionParser = new SpelExpressionParser ...
- java 反射获取方法返回值类型
//ProceedingJoinPoint pjp //获取方法返回值类型 Object[] args = pjp.getArgs(); Class<?>[] paramsCls = ne ...
- java反射-获取方法信息
例子代码如下: package com.reflect; import java.lang.reflect.Method; public class ClassUtill { /* * 打印类的信息, ...
- 为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】
每篇一句 胡适:多谈些问题,少聊些主义 前言 Spring MVC和MyBatis作为当下最为流行的两个框架,大家平时开发中都在用.如果你往深了一步去思考,你应该会有这样的疑问: 在使用Spring ...
- 通过反射获取方法的参数名称(JDK8以上支持)
方法的参数名,在很多时候我们是需要反射得到的.但是在java8之前,代码编译为class文件后,方法参数的类型是固定的,但参数名称却丢失了,这和动态语言严重依赖参数名称形成了鲜明对比.(java是静态 ...
- Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...
- Java反射获取class对象的三种方式,反射创建对象的两种方式
Java反射获取class对象的三种方式,反射创建对象的两种方式 1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName ...
- <经验杂谈>C#中一种最简单、最基本的反射(Reflection):通过反射获取方法函数
说起反射之前和很多用C#/.net的同仁们一样,相比于一般应用层对数据的增删改查总有点觉得深奥到难以理解.其实程序这东西,用过.实践过就很简单,我一直这么认为. 先说下概念:反射 Reflection ...
- java - Logback获取方法名称
java - Logback获取方法名称 摘自: https://blog.csdn.net/qq853632587/article/details/78222780 我们目前正在从 Log4J 迁移 ...
随机推荐
- python将一行多字符转换为多行单字符方法
笔者这次是第一次写东西,主要是想把在运用中的一些实例给记录下来,分享给那些和笔者有同样需求的人.可能分享的方法有些累赘或者不准确,还望各位大佬勿喷,因为笔者也是python小白,这些都是通过搜索汇总得 ...
- Java学习笔记(二)java流程控制
学习笔记2 Java流程控制 这次也是跟着[狂神说Java]Java零基础学习视频通俗易懂继续学习的,持续学习,你我共勉. 一. 用户交互Scanner 1. Scanner对象 之前学的基本语法没有 ...
- 肖sir____Apsara Clouder云计算专项技能认证题目收集
Apsara Clouder云计算专项技能认证: Apsara Clouder云计算专项技能认证:云服务器ECS入门[认证考试真题分享](答案仅供参考) 单选13道题 1.下列哪一个不是重置ECS密码 ...
- mysql常用的查询语句
好记性不如烂笔头! 查询表中全部信息: select * from 表名 查询表中指定列的信息: select 列1,列2 from 表名 数据去重: select distinct 列... fro ...
- JS日期时间增加减少
new Date().add(Date.MONTH, +3).format('Y-m-d') // 加三个月 new Date().add(Date.MONTH, -3).format('Y-m-d ...
- React Developer插件报错Cannot read properties of undefined (reading ‘forEach‘)
安装了3.6的版本React Developer 启用插件后 报错 解决 https://www.crx4chrome.com/crx/3068/ 下载 下载好后,直接拖入扩展程序中
- Go语言快速入门
简介 Go是一个专门针对多处理器系统应用程序的编程进行了优化的,可以媲美C或C++代码的速度,而且更加安全.支持并行进程的语言. Go支持面向对象,而且具有真正的闭包(closures)和反射 (re ...
- 下载接口时出现:Try to run this command from the system terminal. Make sure that you use the correct version of 'pip' installed for your Python interpreter located at 'D:\python\demo\venv\Scripts\...的错误
下载接口时出现:Try to run this command from the system terminal. Make sure that you use the correct version ...
- 【ML】序
以下序言,没有什么实质性内容 搞车需要,头铁开个Machine Learning栏目,希望能长更.
- requests库获取指定关键词的图片,并保存到本地
var code = "45f4267f-9476-44ca-ac68-6d32aad2d4e1" 源码地址:https://gitee.com/myrensheng/data_a ...