qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java反射機制剖析:簡單談談動態代理

           通過《Java反射機制剖析:定義和API》和《Java反射機制剖析:功能以及舉例》的學習,已經對反射有了一定的了解,這一篇通過動態代理的例子來進一步學習反射機制。

            1、代理模式

            代理模式就是為其他對象提供一種代理來控制對這個對象的訪問。其實代理模式是在訪問的對象時引入一定程度的間接性,這種間接性可以附加多種用途。

            它的特征是代理類與委托類有同樣的接口,代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類,以及事后處理消息等。代理類與委托類之間通常會存在關聯關系,一個代理類的對象與一個委托類的對象關聯,代理類的對象本身并不真正實現服務,而是通過調用委托類的對象的相關方法,來提供特定的服務。

            2、分類

            代理類按照創建時期可以分為兩種,靜態代理類和動態代理類。

            靜態代理類:由程序員創建或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。

            動態代理類:在程序運行時,運用反射機制動態創建而成。

            3、靜態代理和動態代理舉例

            靜態代理:

            業務接口類:

          1. package com.bjpowernode.pattern;  
          2. public interface UserManager {  
          3.     public void addUser(String userId, String userName);  
          4.       
          5.     public void delUser(String userId);  
          6.       
          7.     public void modifyUser(String userId, String userName);  
          8.       
          9.     public String findUser(String userId);  
          10. }

            業務接口實現類:

          1. package com.bjpowernode.pattern;  
          2. public class UserManagerImpl implements UserManager {  
          3.     public void addUser(String userId, String userName) {  
          4.         //System.out.println("start-->>addUser() userId-->>" + userId); 
          5.         try {  
          6.             System.out.println("UserManagerImpl.addUser() userId-->>" + userId);  
          7.               
          8.             //System.out.println("success-->>addUser()"); 
          9.         }catch(Exception e) {  
          10.             e.printStackTrace();  
          11.             //System.out.println("error-->>addUser()"); 
          12.             throw new RuntimeException();  
          13.         }     
          14.     }  
          15.     public void delUser(String userId) {  
          16.         System.out.println("UserManagerImpl.delUser() userId-->>" + userId);  
          17.     }  
          18.     public String findUser(String userId) {  
          19.         System.out.println("UserManagerImpl.findUser() userId-->>" + userId);  
          20.         return "張三";  
          21.     }  
          22.     public void modifyUser(String userId, String userName) {  
          23.         System.out.println("UserManagerImpl.modifyUser() userId-->>" + userId);  
          24.     }  
          25. }



            業務代理類:

          1. package com.bjpowernode.pattern;  
          2.  
          3. public class UserManagerImplProxy implements UserManager {  
          4.  
          5.     private UserManager userManager;  
          6.       
          7.     public UserManagerImplProxy(UserManager userManager) {  
          8.         this.userManager = userManager;  
          9.     }  
          10.       
          11.     public void addUser(String userId, String userName) {  
          12.         try {  
          13.             System.out.println("start-->>addUser() userId-->>" + userId);  
          14.             userManager.addUser(userId, userName);  
          15.             System.out.println("success-->>addUser()");  
          16.         }catch(Exception e) {  
          17.             e.printStackTrace();  
          18.             System.out.println("error-->>addUser()");  
          19.         }     
          20.     }  
          21.  
          22.     public void delUser(String userId) {  
          23.  
          24.     }  
          25.  
          26.     public String findUser(String userId) {  
          27.         return null;  
          28.     }  
          29.  
          30.     public void modifyUser(String userId, String userName) {  
          31.  
          32.     }  
          33. }

            客戶端類:

          1. package com.bjpowernode.pattern;  
          2.  
          3. public class Client {  
          4.  
          5.     /**  
          6.      * @param args  
          7.      */ 
          8.     public static void main(String[] args) {  
          9.         //UserManager userManager = new UserManagerImpl();  
          10.         UserManager userManager = new UserManagerImplProxy(new UserManagerImpl());  
          11.         userManager.addUser("0001""張三");  
          12.     }  
          13.  
          14. }

            運行結果:

          1. start-->>addUser() userId-->>0001 
          2. UserManagerImpl.addUser() userId-->>0001 
          3. success-->>addUser()

            動態代理:

            業務接口類:

          1. package com.bjpowernode.pattern;  
          2.  
          3. public interface UserManager {  
          4.  
          5.       
          6.     public String test(String userId);  
          7. }

            業務接口實現類:

          1. package com.bjpowernode.pattern;  
          2.  
          3. public class UserManagerImpl implements UserManager {  
          4.  
          5.     public String test(String userId) {  
          6.         System.out.println("UserManagerImpl.findUser() userId-->>" + userId);  
          7.         return "張三";  
          8.     }  
          9.  
          10. }


          BusinessHandler類:

          1. package com.bjpowernode.pattern;  
          2.  
          3. import java.lang.reflect.InvocationHandler;  
          4. import java.lang.reflect.Method;  
          5. import java.lang.reflect.Proxy;  
          6.  
          7. public class BusinessHandler implements InvocationHandler {  
          8.       
          9.     private Object targetObject;  
          10.       
          11.     public Object newProxyInstance(Object targetObject) {  
          12.           
          13.         this.targetObject = targetObject;  
          14.         return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),  
          15.                                targetObject.getClass().getInterfaces(), this);  
          16.     }  
          17.       
          18.     public Object invoke(Object proxy, Method method, Object[] args)  
          19.             throws Throwable {  
          20.         System.out.println("start-->>" + method.getName());  
          21.         for (int i=0; i<args.length; i++) {  
          22.             System.out.println(args[i]);  
          23.         }  
          24.         Object ret = null;  
          25.         try {  
          26.             //調用目標方法  
          27.             ret = method.invoke(targetObject, args);  
          28.             System.out.println("success-->>" + method.getName());   
          29.         }catch(Exception e) {  
          30.             e.printStackTrace();  
          31.             System.out.println("error-->>" + method.getName());  
          32.             throw e;  
          33.         }  
          34.         return ret;  
          35.     }  
          36.  
          37. }

            客戶端類:

          1. package com.bjpowernode.pattern;  
          2.  
          3. import java.lang.reflect.Field;  
          4.  
          5.  
          6. public class Client {  
          7.  
          8.     /**  
          9.      * @param args  
          10.      */ 
          11.     public static void main(String[] args) {  
          12.           
          13.         BusinessHandler businessHandler = new BusinessHandler();  
          14.         UserManager userManager = (UserManager)businessHandler.newProxyInstance(new UserManagerImpl());  
          15.           
          16.           
          17.           
          18.         //userManager.addUser("0001", "張三");  
          19.         //userManager.delUser("0001");  
          20.        // System.out.println(userManager.getClass().getName());  
          21.           
          22.         String name = userManager.test("0001");  
          23.     //String name = ((UserManagerImpl) logHandler.newProxyInstance(new UserManagerImpl())).test("0001");  
          24.         System.out.println("Client.main() --- " + name);  
          25.     }  
          26.  
          27. }

            運行結果:

          1. start-->>test  
          2. 0001 
          3. UserManagerImpl.findUser() userId-->>0001 
          4. success-->>test  
          5. Client.main() --- 張三

          posted on 2012-02-13 13:35 順其自然EVO 閱讀(179) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2012年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          26272829123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 当涂县| 兴文县| 林西县| 临桂县| 工布江达县| 辛集市| 和平县| 遵义县| 汉中市| 常州市| 竹山县| 台前县| 天门市| 曲周县| 张北县| 土默特右旗| 临朐县| 章丘市| 涡阳县| 黑龙江省| 浮山县| 布尔津县| 合阳县| 清原| 双流县| 朔州市| 曲水县| 崇义县| 清徐县| 巫溪县| 财经| 太湖县| 博罗县| 酒泉市| 调兵山市| 天峨县| 县级市| 花莲县| 徐汇区| 遂昌县| 丹东市|