黑马程序员技术交流社区

标题: 【石家庄校区】增强方法 [打印本页]

作者: Ljp    时间: 2018-2-1 14:35
标题: 【石家庄校区】增强方法
本帖最后由 小石姐姐 于 2018-2-1 15:29 编辑

        Ø 继承: 能够控制这个类
        Ø 装饰者:增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用
        Ø 动态代理:被增强的类实现了接口
        Ø 代理的概述:
        Ø JDK动态代理::Proxy对象
                ○ Proxy.new ProxyInstance(ClassLoader c1,Class[] interface,InvocationHandler )
        Ø 参数一
                ○ 是被装饰对象的类的class对象.classloader,
                ○ 通常写成:对象.getClass.getClassLoader
        Ø 参数二
                        § 通常为InvocationHandler的 实现类对象.getClassinterfice,
                                • 通常写为实现类的对象.getClass().getInterfaces()
        Ø 参数三
                ○ 是被装饰对象所实现的所有接口
                ○ InvocationHandler().InvocationHandlerd
               
               
动态代理的代码编写:
        Proxy.newProxyInstance()
        ClassLoader  :类加载器
        Class[] :被增强的对象进行所有实现的接口
        InvocationHandler :处理类
        
        @WebFilter(urlPatterns="/*")
        public class GenericEncodingFilter implements Filter {
         
                @Override
                public void init(FilterConfig filterConfig) throws ServletException {
         
                }
         
                @Override
                public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
                final HttpServletRequest req = (HttpServletRequest) request;
                // 增强req:
                HttpServletRequest myReq = (HttpServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(),
                req.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 判断执行的方法是否是getParameter:
                if("getParameter".equals(method.getName())){
                // 调用的是getParameter:需要增强这个方法.
                // 判断请求方式是GET还是POST:
                String type = req.getMethod();
                if("get".equalsIgnoreCase(type)){
                String value = (String) method.invoke(req, args);
                value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
                return value;
                }else if("post".equalsIgnoreCase(type)){
                req.setCharacterEncoding("UTF-8");
                }
                }
                return method.invoke(req, args);
                }
                });
                chain.doFilter(myReq, response);
                }
         
                @Override
                public void destroy() {
         
                }
         
        }
        
        Ø 总结:
                ○ 代理的企业应用:
                        § Spring的AOP
                                • AOP的底层是使用动态代理完成
                                        ®  AOP    :面向切面编程.新的思想,用来解决OOP中遇到的一些问题!!!
                                       
        Ø
        
        
                  





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2