jdk动态代理对象:Proxy

  Proxy API:

    static Object   newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler ih);  --返回一个指定接口的代理类实例。

       参数一:ClassLoaader  传入一个类加载器即可;

       参数二:Class[] interfaces  传入被增强类所有实现的接口数组;

       参数三:使用匿名内部类实现InvocationHandler接口;

  InvocationHandler  API:

    Object invoke(Object proxy, Method method, Object[] args);  --在代理实例上处理方法调用并返回结果。

      参数一:proxy  生成的代理对象;

      参数二:method  执行的方法对象;

      参数三:args  要执行方法传入的参数;

使用动态代理实现解决乱码的问题(在过滤器中对request使用动态代理)

  

 1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 2             throws IOException, ServletException {
 3         HttpServletRequest req =  (HttpServletRequest)request;
 4         HttpServletRequest MyReq = (HttpServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
 5             @Override
 6             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 7                 if ("getParameter".equals(method.getName())) {
 8                     if ("get".equalsIgnoreCase(req.getMethod())) {
 9                         String value = (String)method.invoke(req, args);
10                         value = new String(value.getBytes("iso-8859-1"),"utf-8");
11                         return value;
12                     }else if ("post".equalsIgnoreCase(req.getMethod())) {
13                         req.setCharacterEncoding("utf-8");
14                     }
15                 }
16                 return method.invoke(req, args);
17             }
18         });
19         chain.doFilter(MyReq, response);//将增强后的对象传入过去
20     }

 代理的企业应用:

  spring的AOP:   

    AOP的底层使用的就是代理机制:

    AOP:面向切面编程.新的思想,用来解决OOP中遇到的一些问题!!!

posted on 2018-08-25 19:33  zeronexyz  阅读(1180)  评论(0编辑  收藏  举报