为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】
每篇一句
胡适:多谈些问题,少聊些主义
前言
Spring MVC
和MyBatis
作为当下最为流行的两个框架,大家平时开发中都在用。如果你往深了一步去思考,你应该会有这样的疑问:
- 在使用
Spring MVC
的时候,你即使不使用注解,只要参数名和请求参数的key对应上了,就能自动完成数值的封装 - 在使用
MyBatis
(接口模式)时,接口方法向xml里的SQL语句传参时,必须(当然不是100%的必须,特殊情况此处不做考虑)
使用@Param('')
指定key值,在SQL中才可以取到
我敢相信这绝不是我一个人的疑问,因为我在第一次使用MyBatis
的时候就产生过这个疑问并且也尝试过去掉@Param
注解,因为我觉得一个名称让我写两次是有点多此一举的(我太懒了)。
和Spring MVC
人性化处理比起来,当时觉得MyBatis
对这块的处理简直弱爆了。费解了这么长时间,今天我终于可以解释这个现象了,来揭开它的面纱~
问题发现
java
使用者都知道,.java
文件属于源码文件,它需要经过了javac
编译器编译为.class
字节码文件才能被JVM
执行的。
对.class
字节码稍微有点了解的小伙伴应该也知道这一点:Java
在编译的时候对于方法,默认是不会
保留方法参数名,因此如果我们在运行期想从.class
字节码里直接拿到方法的参数名是做不到的。
如下案例,很明显就是获取不到真实参数名喽:
public static void main(String[] args) throws NoSuchMethodException { Method method = Main.class.getMethod("test1", String.class, Integer.class); int parameterCount = method.getParameterCount(); Parameter[] parameters = method.getParameters(); // 打印输出: System.out.println("方法参数总数:" + parameterCount); Arrays.stream(parameters).forEach(p -> System.out.println(p.getType() + "----" + p.getName())); }
打印内容:
方法参数总数:2 class java.lang.String----arg0 class java.lang.Integer----arg1
从结果中可以看到我们并不能获取到真实方法参数名(获取到的是无意义的arg0、arg1
等),这个结果符合我们的理论知识以及预期。
若你有一定技术敏感性,这个时候你应该有这样的疑问:在使用Spring MVC
的时候,