Dynamic proxy 与cglib的简单实现

来源:互联网 发布:qq教程网站源码 编辑:程序博客网 时间:2024/05/01 21:11

动态代理分为:Dynamic proxy(针对实现了接口的类)和cglib(针对实现了无接口的类)。CGLib与Dynamic Proxy的代理机制基本类似,Dynamic Proxy返回的动态代理类,是目标类所实现的接口的另一个实现版本,它实现了对目标类的代理,而CGLib返回的动态代理类,则是目标代理类的一个子类。

下面实例对二者进行简单的实现。由于简单明了,同时代码中有详细的注释,故不一一详解。注意自己导入cglib包

接口代码:China .java

  1. package Test;
  2. /*
  3.  * 接口
  4.  */
  5. public interface China {
  6.     public void sayOlympic(); 
  7. }

实现类:Chinese .java

  1. package Test;
  2. /*
  3.  * 实现类
  4.  */
  5. public class Chinese implements China {
  6.     @Override
  7.     public void sayOlympic() {
  8.         System.out.println("北京欢迎你");
  9.     }
  10. }

辅助工厂类:ChineseFactory .java(可要可不要,具体看实现)

  1. package Test;
  2. /*
  3.  * 辅助工厂类
  4.  */
  5. public class ChineseFactory {
  6.     /*
  7.      * 根据类名创建类的实例
  8.      */
  9.     public Object getInstance(String clz){
  10.         Class obj=null;
  11.         try {
  12.             obj=Class.forName(clz);
  13.             return (Object)obj.newInstance();           
  14.         } catch (ClassNotFoundException e) {            
  15.             e.printStackTrace();
  16.         }catch (InstantiationException e) {         
  17.             e.printStackTrace();
  18.         } catch (IllegalAccessException e) {        
  19.             e.printStackTrace();
  20.         }
  21.         return null;
  22.     }
  23.     /**
  24.     * 根据传入的类名,返回Dynamic proxy AOP代理对象
  25.     * @param clzName
  26.     * @return
  27.     */
  28.     public Object getAopObjectProxy(String clz){
  29.         //ChHandler hander=new ChHandler();
  30.         ChHandler hander=(ChHandler)getInstance("Test.ChHandler");
  31.         return hander.bind(getInstance(clz));
  32.         
  33.     }
  34.     /**
  35.     * 根据传入的类名,返回cglib AOP代理对象
  36.     * @param clzName
  37.     * @return
  38.     */
  39.     public Object getCglibObjectProxy(String clz){
  40.         //ChCglib cglib=new ChCglib();
  41.         ChCglib cglib=(ChCglib)getInstance("Test.ChCglib");
  42.         return cglib.bind(getInstance(clz).getClass());     
  43.     }
  44. }

Dynamic proxy 实现类:ChHandler.java

  1. package Test;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. /*
  6.  * Dynamic proxy动态代理,针对:接口,对应cglib的MethodInterceptor
  7.  */
  8. public class ChHandler implements InvocationHandler {
  9.     Object targetForeigner;
  10.     /**
  11.     * 返回动态代理实例
  12.     * Proxy对应Cglib的Enhancer
  13.     * @param chinese
  14.     * @return
  15.     */
  16.     public Object bind(Object chinese){
  17.         this.targetForeigner=chinese;
  18.         return Proxy.newProxyInstance(chinese.getClass().getClassLoader(), chinese.getClass().getInterfaces(),this);
  19.     }
  20.     /**
  21.     * 在Invoke方法中,Dynamic proxy的实现,该方法在被代理类调用方法时自动调用 
  22.     */
  23.     @Override
  24.     public Object invoke(Object proxy, Method method, Object[] args)
  25.             throws Throwable {
  26.         Object foreigner=null;
  27.         System.out.println("奥运会开幕式开始。。。。");
  28.         foreigner=method.invoke(targetForeigner, args); 
  29.         System.out.println("奥运会开幕式闭幕。。。。");
  30.         return foreigner;
  31.     }   
  32. }

cglib proxy类:ChCglib.java

  1. package Test;
  2. import java.lang.reflect.Method;
  3. import net.sf.cglib.proxy.MethodInterceptor;
  4. import net.sf.cglib.proxy.MethodProxy;
  5. import net.sf.cglib.proxy.Enhancer;
  6. /*
  7.  * 代理cglib,针对:类,对应Dynamic proxy的InvocationHandler
  8.  */
  9. public class ChCglib implements MethodInterceptor {
  10.     private Enhancer enhancer=new Enhancer();
  11.     /**
  12.     * 返回动态代理实例
  13.     * Enhancer对应Dynmaic proxy的Proxy
  14.     * @param chinese
  15.     * @return
  16.     */
  17.     public Object bind(Class clz){
  18.         enhancer.setSuperclass(clz);
  19.         enhancer.setCallback(this);
  20.         return enhancer.create();
  21.     }
  22.     /**
  23.     * 在intercept方法中,cglib proxy的实现,该方法在被代理类调用方法时自动调用
  24.     */
  25.     @Override
  26.     public Object intercept(Object o, Method method, Object[] methodParameters,
  27.             MethodProxy methodProxy) throws Throwable {
  28.         Object foreigner=null;
  29.         System.out.println("奥运会开幕式开始。。。。");
  30.         foreigner=methodProxy.invokeSuper(o, methodParameters); 
  31.         System.out.println("奥运会开幕式闭幕。。。。");
  32.         return foreigner;       
  33.     }
  34. }

与Dynamic Proxy中的Proxy和InvocationHandler相对应,Enhancer和MethodInterceptor在CGLib中负责完成代理对象创建和方法截获处理。

测试类:ChineseApp.java(有多种实现,具体看代码)

  1. package Test;
  2. /*
  3.  * 测试类
  4.  */
  5. public class ChineseApp {
  6.     /**
  7.      * @param args
  8.      */
  9.     public static void main(String[] args) {        
  10.         Object foreigner;
  11.         //Dynamic proxy测试
  12.         //原始做法
  13.         China chinese=new Chinese();
  14.         ChHandler handler=new ChHandler();      
  15.         foreigner=handler.bind(chinese);
  16.         if(foreigner instanceof China){
  17.             System.out.println("Dynamic proxy basic");
  18.             ((China)foreigner).sayOlympic();
  19.         }else{
  20.             System.out.println("中国反对将奥运政治化的外国人");
  21.         }
  22.         //反射机制做法
  23.         ChineseFactory factory=new ChineseFactory();        
  24.         handler=(ChHandler)factory.getInstance("Test.ChHandler");   
  25.         foreigner=handler.bind((China)(factory.getInstance("Test.Chinese")));
  26.         if(foreigner instanceof China){
  27.             System.out.println("Dynamic proxy reflect");
  28.             ((China)foreigner).sayOlympic();
  29.         }else{
  30.             System.out.println("中国反对将奥运政治化的外国人");
  31.         }       
  32.         //反射机制+工厂做法
  33.         factory=new ChineseFactory();   
  34.         foreigner=factory.getAopObjectProxy("Test.Chinese");        
  35.         if(foreigner instanceof China){
  36.             System.out.println("Dynamic proxy reflect factory");
  37.             ((China)foreigner).sayOlympic();
  38.         }else{
  39.             System.out.println("中国反对将奥运政治化的外国人");
  40.         }
  41.         //cglib测试
  42.         //反射机制做法
  43.         ChCglib cglib=new ChCglib();
  44.         Chinese chin=new Chinese();
  45.         foreigner=cglib.bind(chin.getClass());
  46.         if(foreigner instanceof Chinese){
  47.             System.out.println("cglib proxy basic");
  48.             ((Chinese)foreigner).sayOlympic();
  49.         }else{
  50.             System.out.println("cglib说:中国反对将奥运政治化的外国人");
  51.         }
  52.         //反射机制+工厂做法
  53.         factory=new ChineseFactory();
  54.         cglib=(ChCglib)factory.getInstance("Test.ChCglib");
  55.         foreigner=cglib.bind(factory.getInstance("Test.Chinese").getClass());
  56.         if(foreigner instanceof Chinese){
  57.             System.out.println("cglib proxy reflect");
  58.             ((Chinese)foreigner).sayOlympic();
  59.         }else{
  60.             System.out.println("cglib说:中国反对将奥运政治化的外国人");
  61.         }
  62.         //工厂做法之二
  63.         foreigner=factory.getCglibObjectProxy("Test.Chinese");
  64.         if(foreigner instanceof Chinese){
  65.             System.out.println("cglib proxy factory");
  66.             ((Chinese)foreigner).sayOlympic();
  67.         }else{
  68.             System.out.println("cglib说:北京反对将奥运政治化的外国人");
  69.         }
  70.         
  71.         
  72.     }
  73. }

呵呵,简单的实例。

原创粉丝点击