Java如何获取到方法入参名称

背景

  我们在使用SpringMVC的时候根据参数名获取用户传来的数据的时候就要用到这项技术。

具体实现

1. 使用Java8+反射实现

  在使用javac编译时加入[-parameters]参数,然后通过反射就能获取到方法参数名称,但是如果不加这个参数获取到的会是arg0这样的参数名。

如果使用IDEA打开javac设置
IDEA设置
代码如下:

public class TestParameterName {

    public static void testName(String tomcatName) {
        // do nothing
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Method m = TestParameterName.class.getMethod("testName", String.class);
        Parameter[] ps = m.getParameters();
        Arrays.stream(ps).forEach(p -> System.out.println(p.getName()));
    }
}

2. 使用字节码实现

  javac在默认情况下会在本地变量表中存储本地变量的这些信息,其实方法参数和this指针都算是本地变量(值得注意的是在获取的时候如果是实例方法那么本地变量表第一位是this指针入参是从第二位开始如果是static方法入参是从第一位开始)。
在这里插入图片描述
  原理说明白了剩下的就是使用字节码操作类库来获取就可以了。但是根据上边的介绍可以发现如果加入了-g:none那么就不会生成相关信息了。那么使用SpringMVC的兄弟编译时可不要加入这个选项。

具体的字节码实践参考:https://blog.csdn.net/wthfeng/article/details/72112967

实际应用

  SpringMVC的ParameterNameDiscoverer

参考资料

  1. 《深入理解JVM》
  2. 参考内容
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值