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 迁移 ...
随机推荐
- element-ui中rules使用正则验证、表单验证
<template> <el-form :model="DataForm" label-position="top" :rules=" ...
- C语言多维数组的实现与操作
常量和所需的头文件 #include<stdio.h> #include<stdarg.h> #include<stdlib.h> #define MAX_ARRA ...
- 单兵 Web 快速开发框架!
Jmix 是低代码? 自从 Jmix 2018 年在中国推广以来(那时叫 CUBA 平台),很多开发者会在使用之前询问我们,Jmix 是不是低代码,扩展性怎么样? 低代码应用程序平台(LCAP)是当今 ...
- Kali配置gmssl密码算法库
Kali配置gmssl密码算法库 一.密码算法库的下载 https://github.com/guanzhi/GmSSL/releases 二.安装配置 1 解压 把刚刚下载的GmSSL 3.0.0. ...
- [NepCTF2022]signin
signin 题目 from Crypto.Util.number import getStrongPrime,bytes_to_long from gmpy2 import powmod,is_pr ...
- DEPRECATION WARNING: Using / for division is deprecated and will be removed in Dart Sass 2.0.0
DEPRECATION WARNING: Using / for division is deprecated and will be removed in Dart Sass 2.0.0. 问题解决 ...
- (jmeter笔记) websocket接口测试
1.在进程选择WebSocket Sampler 2.Websocket Sampler 界面 webserver Server Name or IP:输入连接的websocket服务器ip Port ...
- 【解决办法】安装Boost 提示'cl'不是内部或外部命令
VisualStudio 2022 Community 亲测可用. 1. 检查下载版本是否是最新版,我开始下的1.66.0会报错,后来换成1.79.0就没问题.官网https://www.boost. ...
- python 对接各大数据库,快速上手!
1.mysql 安装pymysql pip intsall pymysql 快速上手 import pymysql # 第一步:连接到数据库 con = pymysql.connect(host= ...
- Jenkins Pipeline(一) - 创建一个新的pipeline
jenkins pipeline: 使用Goovy语法,以代码形式更自由地编写jenkins job. 代码文本被称为Jenkinsfile IDE: vscode 推荐安装vscode插件: jen ...