浏览器会发送不用的请求给服务器,本质上每一个Servlet都是有一个映射名称,就比如说浏览器发送 /courseContent 给服务器时候,此时服务器会调用 有@WebServlet("/courseContent")的Servlet类,每一个servlet类中都会有很多的方法。
所以每一次浏览器向后台请求数据时候都会带入一个叫methodName的参数,通过methodName值来匹配调用哪一个具体的方法,就比如说当methodName = findCourseList , 这就说明要找的是叫findCourseList的这个方法。最简单的就是用过if语句进行字符串匹配来调方法,但是如果一个Servlet中存在很多很多的方法时候,显然这样子是不合适的,所以就可以改为使用反射技术动态获取方法了。
// 2. 优化if判断,使用反射的方式 if (methodName != null) { try { // 1. 获取字节码文件对象 this == 访问的是哪一个servlet,this就等于哪一个servlet Class c = this.getClass(); // 2. 根据传入的方法名称,获取对应的方法对象 Method method = c.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this,req,resp); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }
通过this.getClass获取当前运行的Servlet字节码对象,然后通过.getMethod()方法获取对象的方法,通过invoke就可以将此方法激活,实现了调用请求的方法。通过反射技术动态调用了方法。
补充:this.getClass 返回值为 当前运行时类的Class对象。