背景说明

最近写反射相关的代码,想获取对应的参数名称,却发现没有特别好的方式。

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 获取参数名称最优雅简单的方式的更多相关文章

  1. 通过java反射得到javabean的属性名称和值参考

    通过java反射得到javabean的属性名称和值 Field fields[]=cHis.getClass().getDeclaredFields();//cHis 是实体类名称 String[] ...

  2. Java反射机制能够获取的信息,与应用

    一.什么是Java反射机制? [1]反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法: [2]对于任意一个对象,都能够调用它的任意一个属性和方法: 像这种动态获取类的信息以及动 ...

  3. Java反射机制二 获取方法的返回值或参数的泛型信息

    在使用反射机制时,我们经常需要知道方法的参数和返回值类型,很简单  ,下面上示例,示例中的两个方法非常相似 package deadLockThread; import java.lang.refle ...

  4. [Java反射基础二]获取类的信息

    本文接上文“Class类的使用”,以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获取成员函数信息 /** * 获取成员函数信息 ...

  5. JAVA反射机制_获取字节码文件对象

    是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...

  6. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  7. 浅谈Java反射机制 之 获取类的 方法 和 属性(包括构造函数)

    上一篇 获取 类 的字节码文件 我们讲到了获取类的字节码文件的三种方法 第三种方法通过getClass("全路径名")获取字节码文件最符合要求 1.获取构造方法 先贴上我们要获取的 ...

  8. 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class

    另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...

  9. Java反射创建带构造参数的类 并执行方法

    部分代码 public void go(ServletRequest request,ServletResponse response){ String methodName = "inde ...

随机推荐

  1. Java锁-Synchronized深层剖析

    Java锁-Synchronized深层剖析 前言 Java锁的问题,可以说是每个JavaCoder绕不开的一道坎.如果只是粗浅地了解Synchronized等锁的简单应用,那么就没什么谈的了,也不建 ...

  2. Git如何fork别人的仓库并作为贡献者提交代码

    例如 要fork一份google的MLperf/inference代码,下面介绍具体做法:预备知识git里的参考有几种表示,分别是上游仓库,远程仓库和本地仓库,逻辑关系如下拉取代码的顺序:别的大牛的代 ...

  3. H5+app -- 自动更新

    一.最近做了一个app自动更新功能,用的基本都是网上找得到的. 1.h5+ 规范 :  http://www.html5plus.org/doc/zh_cn/maps.html 2.环形进度条插件:h ...

  4. 设置eclipse的字体大小

    window->preferences->general->Appearance->Colors and Fonts->basic->text font->点 ...

  5. Vue躬行记(8)——Vue Router

    虽然Vue.js未提供路由功能,但是官方推出了Vue Router(即vue-router库),以插件的形式支持.它与Vue.js深度集成,可快速的创建单页应用(Single Page Applica ...

  6. 05-商品类别数据和VUE展示

    一.商品类别数据和VUE展示 1.商品类别数据接口 将商品类别数据展示出来,视图(views.py)代码如下: class CategoryViewset(mixins.ListModelMixin, ...

  7. XjhDemo 插入数据

    create database XjhDemo gouse XjhDemogo --商品类别Create table Sort( SortId int primary key identity(1,1 ...

  8. 让块元素在div中水平居中,并且垂直居中的五种方法

    在写代码前,先做下准备工作,写两个div,设置下div的大小,把小的div放在大的div里面.可以给小的div设置下颜色,方便观看. 方法一:写一个伪元素,将它设置为行内块元素,高度与父元素相同,写一 ...

  9. zabbix 发送报警邮件

  10. 一篇很好的学习查看Java源代码的文章

    目录: 一. ArrayList概述 二. ArrayList的实现 1) 私有属性 2) 构造方法 3) 元素存储 4) 元素读取 5) 元素删除                 6) 调整数组容量 ...