java反射借助asm获取参数名称最优雅简单的方式-创新互联

背景说明

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

为企业提供网站设计、成都做网站、网站优化、营销型网站、竞价托管、品牌运营等营销获客服务。创新互联建站拥有网络营销运营团队,以丰富的互联网营销经验助力企业精准获客,真正落地解决中小企业营销获客难题,做到“让获客更简单”。自创立至今,成功用技术实力解决了企业“网站建设、网络品牌塑造、网络营销”三大难题,同时降低了营销成本,提高了有效客户转化率,获得了众多企业客户的高度认可!

jdk7 及其以前,是无法通过反射获取参数名称的。

jdk8 可以获取,但是要求指定-parameter启动参数,限制较多。

期间尝试过类似于 Mybatis 使用@Param的方式,但是感觉不够优雅,后来发现了下面的这个工具。

asm-tool 是基于 asm 构建的常见工具类。

下面简单介绍下使用方式。

快速开始

准备

jdk 1.7+

maven 3.x+

maven 引入


    com.github.houbb
    asm-tool
    0.0.2

获取方法参数名称

测试方法

AsmMethodsTest 类下定义一个带有参数的方法

public String common(String name) {
    return name;
}

获取参数名称

通过AsmMethods.getParamNamesByAsm(Method)获取参数名称。

Method method = ClassUtil.getMethod(AsmMethodsTest.class,
        "common", String.class);
List 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 param =  AsmMethods.getParamNamesByAnnotation(method);
Assert.assertEquals("[name]", param.toString());

未指定注解的场景

如果你没有指定注解,则会返回 arg0/arg1/... 这样的结果。

Method method = ClassUtil.getMethod(AsmMethodsTest.class,
        "common", String.class);
List 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 param =  AsmMethods.getParamNamesByAnnotation(constructor);
Assert.assertEquals("[age]", param.toString());

基于 asm

  • 构造器定义
public ConstructorService(String name) {
}
  • 获取参数名称
Constructor constructor = ClassUtil.getConstructor(ConstructorService.class, String.class);
List param =  AsmMethods.getParamNamesByAsm(constructor);
Assert.assertEquals("[name]", param.toString());

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


新闻名称:java反射借助asm获取参数名称最优雅简单的方式-创新互联
标题来源:http://ybzwz.com/article/djijgg.html