动态代理

  • 在方法过多时,装饰者模式可能会有点繁杂。
  • 动态代理模式,通过底层的虚拟机,操作对应类的class文件,增强对应的类方法,得到一个增强后的代理对象
  • 用途:一次解决网站的请求、响应编码解码:在过滤器中增强 HttpRequestHttpResponse的对应方法,在放行时将增强后的代理对象传过去
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //将request对象转换为HttpServletRequest
        final HttpServletRequest req=(HttpServletRequest)request;
        //让JDK在内存中生成代理对象:增强了req对象上的getParameter(name);API
        HttpServletRequest myReq=(HttpServletRequest)Proxy.newProxyInstance(EncodingFilter.class.getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
            
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                
                Object obj=null;
                
                if(method.getName().equalsIgnoreCase("getParameter")){
                    //获取本次请求方式
                    String md=req.getMethod();
                    if("get".equalsIgnoreCase(md)){
                        //get方式的请求
                        //调用req对象上的getParameter方法
                        String v=(String)method.invoke(req, args);
                        //转码
                        String vv=new String(v.getBytes("iso-8859-1"),"utf-8");
                        return vv;
                        
                    }else{
                        //post方式的请求
                        req.setCharacterEncoding("utf-8");
                        obj=method.invoke(req, args);
                    }
                    
                    
                }else{
                    obj=method.invoke(req, args);
                }
                return obj;
            }
        });
        //将代理对象放行
        chain.doFilter(myReq, response);
    }

你可能感兴趣的:(动态代理)