使用CGLIB包创建动态代理

本文通过示例代码详细介绍了如何使用Java动态代理和Cglib实现面向切面编程(AOP)。包括了基本原理、核心代码实现及不同场景下的应用方式。

 参考资料:

http://elathen.itpub.net/post/32506/294971

http://elathen.itpub.net/post/32506/294972

http://elathen.itpub.net/post/32506/294973

 

示例:

China.java

  1. package proxy;
  2. public interface China {
  3.     public void sayOlympic();
  4. }

Chinese.java

  1. package proxy;
  2. public class Chinese implements China {
  3.     public void sayOlympic() {
  4.         System.out.println("北京欢迎你");
  5.     }
  6. }

ChHandler.java

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

ChCglib.java

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

 

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值