首页 > 代码库 > 实现动态代理的两种方式介绍+例子demo(JDK、CGlib)

实现动态代理的两种方式介绍+例子demo(JDK、CGlib)

JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类如何实现动态代理呢

这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。

JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。


一、JDK这种方式动态代理

1. 没引入spring配置文件时,怎么实现JDK动态代理


情景介绍:如何解决全站中文乱码问题?

我们会定义一个过滤器:CharacterEncodingFilter

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. package cn.xym.empmis.web.filter; 
  2.  
  3. import java.io.IOException; 
  4. import java.lang.reflect.InvocationHandler; 
  5. import java.lang.reflect.Method; 
  6. import java.lang.reflect.Proxy; 
  7.  
  8. import javax.servlet.Filter; 
  9. import javax.servlet.FilterChain; 
  10. import javax.servlet.FilterConfig; 
  11. import javax.servlet.ServletException; 
  12. import javax.servlet.ServletRequest; 
  13. import javax.servlet.ServletResponse; 
  14. import javax.servlet.http.HttpServletRequest; 
  15. import javax.servlet.http.HttpServletResponse; 
  16.  
  17. /**
  18. * 解决全站乱码问题
  19. * @author Administrator
  20. *
  21. */ 
  22. public class CharacterEncodingFilterimplements Filter{ 
  23.  
  24.     @Override 
  25.     public void init(FilterConfig filterconfig)throws ServletException { 
  26.         // TODO Auto-generated method stub 
  27.          
  28.     } 
  29.  
  30.     @Override 
  31.     public void doFilter(ServletRequest servletrequest, 
  32.             ServletResponse servletresponse, FilterChain filterchain) 
  33.             throws IOException, ServletException { 
  34.          
  35.          
  36.         final HttpServletRequest request = (HttpServletRequest) servletrequest; 
  37.         HttpServletResponse response = (HttpServletResponse) servletresponse; 
  38.         request.setCharacterEncoding("UTF-8"); //只能解决Post方式提交的乱码问题,无法解决get提交的乱码 
  39.          
  40.         //可以用包装设计模式,也可以用动态代理技术来解决get请求的乱码问题 
  41.          
  42.         filterchain.doFilter((ServletRequest) Proxy.newProxyInstance(CharacterEncodingFilter.class.getClassLoader() 
  43.                 , request.getClass().getInterfaces() 
  44.                 , new InvocationHandler() { 
  45.                      
  46.                     @Override 
  47.                     public Object invoke(Object proxy, Method method, Object[] args) 
  48.                             throws Throwable { 
  49.                         //proxy表示:动态代理对象 
  50.                         //method表示:需要代理的方法 
  51.                         //args表示需要代理方法的参数 
  52.                         if (!method.getName().equals("getParameter")){ 
  53.                             return method.invoke(request, args); 
  54.                         } 
  55.                         if (!request.getMethod().equalsIgnoreCase("get")){ 
  56.                             return method.invoke(request, args); 
  57.                         } 
  58.                         //满足要拦截处理的条件了 
  59.                         String value = http://www.mamicode.com/(String) method.invoke(request,args); >
  60.                         if (value =http://www.mamicode.com/=>null){ 
  61.                             returnnull
  62.                         } 
  63.                         returnnew String(value.getBytes("iso8859-1"),"UTF-8"); 
  64.                     } 
  65.                 }), response); 
  66.     } 
  67.     @Override 
  68.     public void destroy() { 
  69.         // TODO Auto-generated method stub 
  70.          
  71.     } 
  72.