每篇一句

胡适:多谈些问题,少聊些主义

前言

Spring MVCMyBatis作为当下最为流行的两个框架,大家平时开发中都在用。如果你往深了一步去思考,你应该会有这样的疑问:

  • 在使用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的时候,