Java如何获取到方法入参名称
背景
我们在使用SpringMVC的时候根据参数名获取用户传来的数据的时候就要用到这项技术。
具体实现
1. 使用Java8+反射实现
在使用javac编译时加入[-parameters]参数,然后通过反射就能获取到方法参数名称,但是如果不加这个参数获取到的会是arg0这样的参数名。
如果使用IDEA打开javac设置
代码如下:
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.****.net/wthfeng/article/details/72112967
实际应用
SpringMVC的ParameterNameDiscoverer
参考资料
- 《深入理解JVM》
- 参考内容