java 反射借助 asm 获取参数名称最优雅简单的方式
背景说明
最近写反射相关的代码,想获取对应的参数名称,却发现没有特别好的方式。
jdk7 及其以前,是无法通过反射获取参数名称的。
jdk8 可以获取,但是要求指定 -parameter 启动参数,限制较多。
期间尝试过类似于 Mybatis 使用 @Param 的方式,但是感觉不够优雅,后来发现了下面的这个工具。
asm-tool 是基于 asm 构建的常见工具类。
下面简单介绍下使用方式。
快速开始
准备
jdk 1.7+
maven 3.x+
maven 引入
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>asm-tool</artifactId>
<version>0.0.2</version>
</dependency>
获取方法参数名称
测试方法
AsmMethodsTest 类下定义一个带有参数的方法
public String common(String name) {
return name;
}
获取参数名称
通过 AsmMethods.getParamNamesByAsm(Method) 获取参数名称。
Method method = ClassUtil.getMethod(AsmMethodsTest.class,
"common", String.class);
List<String> param = AsmMethods.getParamNamesByAsm(method);
Assert.assertEquals("[name]", param.toString());
第一行获取我们定义的方法对应的 Method 信息;
第一行直接调用获取结果;
第三行进行断言验证。
基于参数注解
参数注解
使用过 mybatis 的开发对于 @Param 注解应该并不陌生。
其实这也是一种解决获取方法名称的方式,那就是基于 @Param 注解。
@Param 注解
这个注解非常简单,直接可以定义在参数列表上,用于显示指定该字段的名称。
public String forParam(@Param("name") String name) {
return name;
}
获取方式
通过 AsmMethods.getParamNamesByAnnotation(Method) 即可获取。
Method method = ClassUtil.getMethod(AsmMethodsTest.class,
"forParam", String.class);
List<String> param = AsmMethods.getParamNamesByAnnotation(method);
Assert.assertEquals("[name]", param.toString());
未指定注解的场景
如果你没有指定注解,则会返回 arg0/arg1/... 这样的结果。
Method method = ClassUtil.getMethod(AsmMethodsTest.class,
"common", String.class);
List<String> param = AsmMethods.getParamNamesByAnnotation(method);
Assert.assertEquals("[arg0]", param.toString());
获取构造器参数名称
简介
和获取方法非常类似。
也有基于注解和基于 asm 两种方式。
基于注解
- 构造器定义
public ConstructorService(@Param("age") Integer age) {
}
- 获取参数名称
Constructor constructor = ClassUtil.getConstructor(ConstructorService.class, Integer.class);
List<String> param = AsmMethods.getParamNamesByAnnotation(constructor);
Assert.assertEquals("[age]", param.toString());
基于 asm
- 构造器定义
public ConstructorService(String name) {
}
- 获取参数名称
Constructor constructor = ClassUtil.getConstructor(ConstructorService.class, String.class);
List<String> param = AsmMethods.getParamNamesByAsm(constructor);
Assert.assertEquals("[name]", param.toString());
java 反射借助 asm 获取参数名称最优雅简单的方式的更多相关文章
- 通过java反射得到javabean的属性名称和值参考
通过java反射得到javabean的属性名称和值 Field fields[]=cHis.getClass().getDeclaredFields();//cHis 是实体类名称 String[] ...
- Java反射机制能够获取的信息,与应用
一.什么是Java反射机制? [1]反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法: [2]对于任意一个对象,都能够调用它的任意一个属性和方法: 像这种动态获取类的信息以及动 ...
- Java反射机制二 获取方法的返回值或参数的泛型信息
在使用反射机制时,我们经常需要知道方法的参数和返回值类型,很简单 ,下面上示例,示例中的两个方法非常相似 package deadLockThread; import java.lang.refle ...
- [Java反射基础二]获取类的信息
本文接上文“Class类的使用”,以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获取成员函数信息 /** * 获取成员函数信息 ...
- JAVA反射机制_获取字节码文件对象
是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- java反射 cglib asm相关资料
有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...
- 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)
上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...
- 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class
另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...
- Java反射创建带构造参数的类 并执行方法
部分代码 public void go(ServletRequest request,ServletResponse response){ String methodName = "inde ...
随机推荐
- Android9.0 SystemUI 网络信号栏定制修改
前情提要 Android 8.1平台SystemUI 导航栏加载流程解析 9.0 改动点简要说明 1.新增 StatusBarMobileView 替代 SignalClusterView,用以控制信 ...
- linux 相关指令
modinfo *.ko 显示驱动文件的信息.
- 痞子衡嵌入式:串行EEPROM接口事实标准及SPI EEPROM简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是EEPROM接口标准及SPI EEPROM. 痞子衡之前写过一篇文章 <SLC Parallel NOR简介>,介绍过并行N ...
- 高德地图3D菱形 区域点击搜索
更新一波吧 <!doctype html> <html lang="zh-CN"> <head> <!-- 原始地址://webapi.a ...
- 全网阅读过20k的Java集合框架常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...
- 新手如何正确安装python,视图详解
今天教新手如何安装python,因为Python是跨平台的,它可以运行在Windows.Mac和各种Linux/Unix系统上.在Windows上写Python程序,放到Linux上也是能够运行的.学 ...
- 将训练集构建成ImageNet模型
以下程序实现将训练集构建为ImageNet模型,训练集图片为56个民族 import java.io.File; import java.io.FileNotFoundException; impor ...
- Jumpserver v2.0.0 使用说明
官方文档:http://www.jumpserver.org/ — 登录脚本 — 1.1 使用paramiko原生ssh协议登录后端主机(原来版本使用pexpect模拟登录) 1.2 新增使用别名或备 ...
- nyoj 72-Financial Management (求和 ÷ 12.0)
72-Financial Management 内存限制:64MB 时间限制:3000ms 特判: No 通过数:7 提交数:12 难度:1 题目描述: Larry graduated this ye ...
- requests保存图片
1.创建07_save_jpg.py文件 import requests #发送请求respone = requests.get("https://www.baidu.com/img/bd_ ...