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 ...
随机推荐
- mount 和 /etc/fstab关系。
mount -a 自动按照格式执行/etc/fstab里面的文件. /etc/fstab 文件格式: device mount-point type options ...
- inux下vi命令大全
分类: LINUX 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文 ...
- 易初大数据 2019年10月24日 spss笔记 王庆超
数据文件的重置结构:横向结构(个案组),纵向结构,不符合分析方法的时候就需要重组,选定变量重组为个案,数据—重构,重构数据向导,选定变量重组为个案,将选定个案重构位变量,转置所有数据,变量组数目,一个 ...
- php imagick生成图片需要注意的问题
php imagick生成图片需要注意的问题 坐标必须写死不要写自适应 这样才能达到效果图的最好效果 而且不会出现各种问题如果前端显示的生成图片不达标 可以再写一套代码 把后台生成的图片透明度设成0 ...
- jsp+servlet分页查询
分页查询 减少服务器内存开销 提高用户体验 效果图 思绪图 分页显示Bean文件代码 package cn.ytmj.findlist.domain; import java.util.List; / ...
- tomcat日志(1)
tomcat日志配置之一自带log 2014-03-19 09:58 33737人阅读 评论(2) 收藏 举报 分类: java(49) 问题 tomcat每次启动时,自动在logs目录下生产以下日志 ...
- 6.2.2 辅助类GenericOptionsParser,Tool和ToolRunner深入解析
辅助类GenericOptionsParser,Tool和ToolRunner (1)为什么要用ToolRunner 将MapReduce Job配置参数写到java代码里,一旦变更意味着修改java ...
- Leetcode算法【114. 二叉树展开为链表】
上周通过一位小伙伴,加入了一个氛围很好的小群,人不多,但是大家保持着对知识的渴望,让我很感动. 我自己也有一个群,人数也不多,但是能真正互动起来一起学习,一起进步的,还是太少.所以,现在也在学习如何让 ...
- nyoj 52-无聊的小明 (模拟, SET)
52-无聊的小明 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:1 submit:3 题目描述: 这天小明十分无聊,没有事做,但不甘于无 ...
- VLAN实验(3)
1.选择2台S3700和5台pc机,并根据实验编址完成此拓扑图. 2.启动设备,检查设备的连通性: 由于现在我们还没有划分VLAN,这5台PC,还在同一个VLAN中,现在我们启动所有的设备,这是所有的 ...