免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
java 代理模式實現(xiàn):java原生proxy類和增強型cglib庫

大家可能都聽說過spring的AOP編程,其實用java的反射機制也可以輕松實現(xiàn)。

我對AOP一個淺顯的理解就是,當(dāng)你在調(diào)用某個方法時,可以在調(diào)用之前或調(diào)用之后執(zhí)行一些預(yù)前操作或預(yù)后操作,而不用更改被調(diào)用方法把預(yù)前操作或預(yù)后操作硬編碼進去,你可以采用一種更靈活的方式,就是用代理模式來實現(xiàn)。

 

場景介紹:當(dāng)我們在吃水果的時候,我們并不是直接拿到水果就吃,而是1.先用水洗洗水果,再2.吃水果,3.吃完后再洗洗手,擦擦嘴

操作2是我們直接想做的事,而操作1和操作3則是預(yù)前和預(yù)后操作。

 

怎么做呢?

 

用組合方法簡單實現(xiàn)代理模式

實現(xiàn)1:

 

抽象一個Person接口,定義一個Person的實現(xiàn)類PersonA,再實現(xiàn)代理類

 

輸出結(jié)果:

 

washing:apple

person A is eating:apple

washing hands

 

 

 

用java原生java.lang.reflect.Proxy實現(xiàn)

 

實現(xiàn)2只適應(yīng)于特定接口的代理,如果我們想實現(xiàn)對任何接口的代理呢。

為什么現(xiàn)在只提到接口呢,可能你會問,為什么不直接對具體類進行代理呢?問的好,因為java.lang.reflect.Proxy類只能對接口進行代理,對具體類的代理要放到最后才講,所以為了由淺入深,先賣個關(guān)子。君莫急。

 

實現(xiàn)2:

 

 

輸出結(jié)果:

 

washing:apple

person A is eating:apple

washing hands

 

 

 

 

封裝實現(xiàn)2

有人可能會覺得,我還得再寫一個handler,再調(diào)用proxy.newInstance.好麻煩啊,能不能一次性搞定。好,給你。

雖然代理的是具體類,但需要具體類實現(xiàn)某個接口。但已經(jīng)能模擬直接代理具體類了。

如這里雖然直接代理PersonA,但還是需要Person接口。等到了實現(xiàn)4就可以去掉Person接口了。

我還加了點東西,至于是什么,你看看就知道了。


實現(xiàn)3

  1. public class ProxyBroker implements InvocationHandler {  
  2.     private Object delegate = null;  
  3.     private ProxyBroker(Object delegate) {  
  4.         // TODO Auto-generated constructor stub  
  5.         this.delegate = delegate;  
  6.     }  
  7.     public static Object newProxy(Object obj) {  
  8.         ProxyBroker broker = new ProxyBroker(obj);  
  9.         Class[] interfaces = obj.getClass().getInterfaces();  
  10.         Class inteface = null;  
  11.         if (Pattern  
  12.                 .compile("^java[x]{0,1}")  
  13.                 .matcher(  
  14.                         obj.getClass()  
  15.                                 .getCanonicalName()  
  16.                                 .subSequence(  
  17.                                         0,  
  18.                                         obj.getClass().getCanonicalName()  
  19.                                                 .length())).find()) {  
  20.             if (obj.getClass().getInterfaces().length > 0)  
  21.                 inteface = obj.getClass().getInterfaces()[0];  
  22.             else  
  23.                 System.err.println("no avaliable interface implemented by :"  
  24.                         + obj.getClass().getCanonicalName());  
  25.         } else {  
  26.             for (Class interfacc : interfaces) {  
  27.                 if (!Pattern  
  28.                         .compile("^java[x]{0,1}")  
  29.                         .matcher(  
  30.                                 interfacc.getCanonicalName().subSequence(0,  
  31.                                         interfacc.getCanonicalName().length()))  
  32.                         .find()) {  
  33.                     inteface = interfacc;  
  34.                 }  
  35.             }  
  36.         }  
  37.         return Proxy.newProxyInstance(inteface.getClassLoader(),  
  38.                 new Class[] { inteface }, broker);  
  39.     }  
  40.     @Override  
  41.     public Object invoke(Object proxy, Method method, Object[] args)  
  42.             throws Throwable {  
  43.         // TODO Auto-generated method stub  
  44.         Object obj = null ;  
  45.         if(method.getName().equals("eat")){  
  46.         washFruit((String)args[0]) ;  
  47.          obj =  method.invoke(delegate, args);  
  48.          clean();  
  49.          }else  
  50.              obj =  method.invoke(delegate, args);  
  51.          return obj ;  
  52.            
  53.     }  
  54.     public static void main(String[] args) {  
  55.         Person p = (Person) ProxyBroker.newProxy(new PersonA());  
  56.         p.eat("apple");  
  57.         Comparable intg = (Comparable) ProxyBroker.newProxy(new Integer(10));  
  58.         System.out.println(intg.compareTo(11));  
  59.     }  
  60.       
  61.     private void washFruit(String fruit){  
  62.         System.out.println("washing:"+fruit);  
  63.     }  
  64.     private void clean(){  
  65.         System.out.println("washing hands");  
  66.     }  
  67. }  
 

 

washing:apple

person A is eating:apple

washing hands

-1 //看到這個就知道我加了什么了,我能對java.lang.Integer進行代理,但因為其實現(xiàn)的是Comparable<T>接口

    //所以只能調(diào)用compareTo()方法

 

 

 

cglib實現(xiàn)

利器出現(xiàn)了,不需要你想代理的類實現(xiàn)莫個接口,是個類就行。所以在這里,可以去掉Person接口的定義了,不要再迷戀它了。很強大的吧

 

實現(xiàn)4

  1. public class CglibProxyBroker implements MethodInterceptor {  
  2.     private static CglibProxyBroker delegate = new CglibProxyBroker();  
  3.       
  4.     private CglibProxyBroker() {  
  5.         // TODO Auto-generated constructor stub  
  6.     }  
  7.       public static  Object newInstance( Class clazz ){  
  8.                 try{  
  9.                       Enhancer e = new Enhancer();  
  10.                       e.setSuperclass(clazz);  
  11.                       e.setCallback(delegate);  
  12.                       return e.create();  
  13.                }catch( Throwable e ){  
  14.                    e.printStackTrace();   
  15.                   throw new Error(e.getMessage());  
  16.                }    
  17.                
  18.          }  
  19.         
  20.     @Override  
  21.     public Object intercept(Object arg0, Method arg1, Object[] arg2,  
  22.             MethodProxy arg3) throws Throwable {  
  23.         // TODO Auto-generated method stub  
  24.         Object obj  = null;  
  25.         if(arg1.getName().equals("eat")){  
  26.             washFruit((String)arg2[0]);  
  27.         obj =  arg3.invokeSuper(arg0, arg2);  
  28.         clean();  
  29.         }else  
  30.             obj = arg3.invokeSuper(arg0, arg2) ;  
  31.         return obj;  
  32.     }  
  33.       
  34.       
  35.     public static void main(String[] args) {  
  36.           
  37.         Person p = (Person)CglibProxyBroker.newInstance(new PersonA().getClass());  
  38.         p.eat("apple");  
  39.           
  40.     }  
  41.       
  42.     private void washFruit(String fruit){  
  43.         System.out.println("washing:"+fruit);  
  44.     }  
  45.     private void clean(){  
  46.         System.out.println("washing hands");  
  47.     }  
  48. }  
 

washing:apple

person A is eating:apple

washing hands

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Spring框架中的AOP思想動態(tài)代理模式
代理模式之Java動態(tài)代理
動態(tài)代理模式——JDK動態(tài)代理
基礎(chǔ)加強第五天-- Java 反射
反射實現(xiàn) AOP 動態(tài)代理模式(Spring AOP 的實現(xiàn) 原理) - Java 例子 ...
JAVA的代理模式 -設(shè)計模式-Java
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服