一、代码
package com.sxl.web.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.invoke.VarHandle; import java.lang.reflect.Method; public class BaseServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ //设置编码 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); //获取方法名 String m = request.getParameter("method"); //获取方法类 Class<? extends BaseServlet> clazz = this.getClass(); //获取要执行的方法 try { Method method = clazz.getDeclaredMethod(m, HttpServletRequest.class, HttpServletResponse.class); method.setAccessible(true); method.invoke(this,request,response); } catch (Exception e) { e.printStackTrace(); System.out.println("BaseServlet异常处理"); } } }
二、代码盲点分析
1.
//获取方法类 Class<? extends BaseServlet> clazz = this.getClass();
解析:通过反射方法中this.getClass()获得方法类
2.
//获取要执行的方法 try { Method method = clazz.getDeclaredMethod(m, HttpServletRequest.class, HttpServletResponse.class); method.setAccessible(true); method.invoke(this,request,response);
解析:① Method method = clazz.getDeclaredMethod(String name, Class<?>… parameterTypes) 获取本类中的所有方法
②method.setAccessible(flag)//默认的flag为false。当flag为true表明屏蔽Java、
语言的访问检查,时期对象中的私有属性也可以被查询和设置
③调用方法(invoke(Object obj, Object... args)
)