A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 645564355 初级黑马   /  2018-6-9 09:37  /  580 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

【案例:使用动态代理完成字符集编码过滤器的编写】

【request中的方法的增强】
        * 继承     :能够控制这个类的构造.
        * 装饰者   :增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用.
                   缺点:* 接口中方法过多,只增强其中的某个方法.其他的方法也需要重写.
        * 动态代理 :被增强的类实现了接口.
【代理的概述】

Note;可以理解为,用一个代理对象代替需要被增强的类

* JDK中动态代理:Proxy对象.
* Proxy.newProxyInstance(ClassLoader cl,Class[] interfaces,InvocationHandler  ih);        //    Invocation 调用


public void doFilter(ServletRequest request, ServletResponse  response, FilterChain chain) throws IOException,  ServletException {
           final HttpServletRequest req = (HttpServletRequest)  request;
           
           Class clazz = req.getClass();
           ClassLoader classLoader = clazz.getClassLoader();
           Class[] interfaces = clazz.getInterfaces();
           
           HttpServletRequest myRequest =  (HttpServletRequest)Proxy.newProxyInstance(classLoader,  interfaces, new InvocationHandler() {
                //   匿名内部类,重写invoke方法
                //   method就是增强对象调用的方法,args就是方法的参数,proxy是代理对象的引用
                @Override
                public Object invoke(Object proxy, Method  method, Object[] args) throws Throwable {
                     // 如果调用的是getParameter方法,则进行增强
                     if("getParameter".equals(method.getName())){
                           // 如果是Post方法
                           if("POST".equals(req.getMethod())){
                                req.setCharacterEncoding("utf-8");
                                return method.invoke(req, args);
                           // 如果是Get方法
                           }else  if("GET".equals(req.getMethod())){   
                                return new  String(req.getParameter((String)args[0]).getBytes("iso-8859-1"),"UTF-8");
                           }
                     }
                     // 其他不增强的方法,直接调用不增强
                     return method.invoke(req, args);
                }
           });
           // 最后放行
           chain.doFilter(myRequest, response);
     }


代理的企业应用:

【Spring的AOP】
AOP的底层使用的就是代理机制:
            * AOP   :面向切面编程.新的思想,用来解决OOP中遇到的一些问题!!!

类加载器:

类的加载器:将class文件加载到JVM中执行这个文件.
Java中将类加载器分成三类:
引导类加载器:     JAVA_HOME/jre/lib/rt.jar
     |
扩展类加载器:     JAVA_HOME/jre/lib/ext/*.jar
     |
应用类加载器:     加载类路径下的所有的class.
这些类加载器如何保证类只会加载一次而且不会重复加载:
类加载器的全盘委托机制:
class A {
String s;
}
由应用类加载器得到A.class String,class,委托给扩展类加载器,扩展类加载器又委托给引导类加载器.引导类加载器加载String.class.将其他的类的class向下给扩展类加载器.扩展类加载器没有找到.向下给应用类加载器,将A.class 加载.

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马