日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
代理模式之Java動態(tài)代理

1. Overview

Java在java.lang.reflect包下,定義了自己的代理。利用這個包下的類,我們可以在運行時動態(tài)地創(chuàng)建一個代理類,實現(xiàn)一個或多個接口。并將方法的調(diào)用轉(zhuǎn)發(fā)到你所指定的類。因為實際代理是在運行時創(chuàng)建的,所以稱為:動態(tài)代理。

Proxy:完全由java產(chǎn)生的,而且實現(xiàn)了完整的subject接口。

InvocationHandler:Proxy上的任何方法調(diào)用都會被傳入此類,InvocationHandler控制對RealSubject的訪問。

因為Java已經(jīng)幫助我們創(chuàng)建了Proxy類,我們需要有辦法告訴Proxy類你要做什么,我們不能像以前一樣把代碼寫入到Proxy類中,因為Proxy類不是我們實現(xiàn)的。那么我們應(yīng)該放在哪里?放在InvocationHandler類中,InvocationHandler類是響應(yīng)代理的任何調(diào)用。我們可以吧InvocationHandler想成是代理收到方法調(diào)用后,請求做實際工作的對象。

2. java.lang.reflect.InvocationHandler

被代理實例所實現(xiàn)的一個接口,內(nèi)部只有一個invoke()方法,簽名如下;

Java代碼

 
 
 
 
  1. public Object invoke(Object proxy, Method method, Object[] args)  

當(dāng)代理的方法被調(diào)用的時候,代理就會把這個調(diào)用轉(zhuǎn)發(fā)給InvocationHandler,也就會調(diào)用它的invoke()方法。

3. java.lang.reflect.Proxy

提供用于創(chuàng)建動態(tài)代理類和實例的靜態(tài)方法,它還是由這些方法創(chuàng)建的所有動態(tài)代理類的超類,我們經(jīng)常使用的靜態(tài)方式是:

Java代碼

 
 
 
 
  1. newProxyInstance(ClassLoader loader, Class [] interfaces, InvocationHandler h) 

4. 示例:

情形:自己可以查看修改姓名性別,但是不能修改rate。他人可以查看姓名,性別以及修改rate,但是不能修改姓名性別。

4.1 定義一個接口:

Java代碼

 
 
 
 
  1. public interface Person {   
  2.        
  3.     String getName();   
  4.        
  5.     String getGender();   
  6.        
  7.     void setName(String name);   
  8.        
  9.     void setGender(String gender);   
  10.        
  11.     void setRate(int rate);   
  12.        
  13.     int getRate();   
  14. }  

4.2 定義實現(xiàn)Person接口類

Java代碼

 
 
 
 
  1. public class PersonImpl implements Person {   
  2. String name;   
  3.   
  4. String gender;   
  5.   
  6. String interests;   
  7.   
  8. int rate;   
  9.   
  10. public String getName() {   
  11.     return name;   
  12. }   
  13.   
  14. public void setName(String name) {   
  15.     this.name = name;   
  16. }   
  17.   
  18. public String getGender() {   
  19.     return gender;   
  20. }   
  21.   
  22. public void setGender(String gender) {   
  23.     this.gender = gender;   
  24. }   
  25.   
  26. public String getInterests() {   
  27.     return interests;   
  28. }   
  29.   
  30. public void setInterests(String interests) {   
  31.     this.interests = interests;   
  32. }   
  33.   
  34. public int getRate() {   
  35.     return rate;   
  36. }   
  37.   
  38. public void setRate(int rate) {   
  39.     this.rate = rate;   
  40. }  

4.3 定義OwnerInvocationHandler類,表示如果為本人,則可以進(jìn)行修改查看姓名性別。

Java代碼

 
 
 
 
  1. public class OwnerInvocationHandler implements InvocationHandler{   
  2.        
  3.     private Person personBean;   
  4.        
  5.     public OwnerInvocationHandler(Person personBean){   
  6.         this.personBean = personBean;   
  7.     }   
  8.        
  9.     @Override  
  10.     public Object invoke(Object proxy, Method method, Object[] args)   
  11.             throws IllegalAccessException {   
  12.            
  13.         try {   
  14.             if(method.getName().startsWith("get")){//如果方法名為get,就調(diào)用person類內(nèi)的get相應(yīng)方法   
  15.   
  16.                 return method.invoke(personBean, args);   
  17.             }else if(method.getName().equals("setRate")){ // 如果方法是setRate,則拋出異常   
  18.                 throw new IllegalAccessException("access deny");   
  19.             }else if(method.getName().startsWith("set")){  //如果為set,就調(diào)用person類內(nèi)的set相應(yīng)方法   
  20.                 return method.invoke(personBean, args);   
  21.             }else {   
  22.                 System.out.println("non method invoke");   
  23.             }   
  24.         } catch (InvocationTargetException e) {   
  25.             e.printStackTrace();   
  26.         }   
  27.         return null;    
  28.            
  29.     }   
  30.        
  31. }  

4.4 定義NonInvocationHandler類,表示如果不為本人,則可以進(jìn)行查看姓名性別和修改rate。

Java代碼

 
 
 
 
  1. public class NonInvocationHandler implements InvocationHandler{   
  2.     //   
  3.     private Person person;   
  4.        
  5.     public NonInvocationHandler(Person person){   
  6.         this.person = person;   
  7.     }   
  8.   
  9.     @Override  
  10.     public Object invoke(Object proxy, Method method, Object[] args)   
  11.             throws Throwable {   
  12.         if(method.getName().startsWith("setRate")){   
  13.             return method.invoke(person, args);   
  14.         }else if (method.getName().startsWith("get")){   
  15.             return method.invoke(person, args);   
  16.         } else {   
  17.             System.out.println("non method invoke");   
  18.             return null;   
  19.         }   
  20.     }   
  21.        
  22. }  

4.5 測試類MyDynamicProxy

Java代碼

 
 
 
 
  1. public class MyDynamicProxy {   
  2.   
  3. public Person getOwnerPersonBeanProxy(Person person){   
  4.     return (Person)Proxy.newProxyInstance(person.getClass().getClassLoader(),    
  5.             person.getClass().getInterfaces(), new OwnerInvocationHandler(person));   
  6. }   
  7.   
  8. public Person getNonPersonBeanProxy(Person person){   
  9.     return (Person)Proxy.newProxyInstance(person.getClass().getClassLoader(),    
  10.             person.getClass().getInterfaces(), new NonInvocationHandler(person));   
  11. }   
  12.   
  13. public static void main(String[] args) {   
  14.     MyDynamicProxy mdp = new MyDynamicProxy();   
  15.     mdp.test();   
  16.        
  17. }   
  18.   
  19. public void test(){   
  20.                 //   
  21.     Person person = getPersonBeanFromDB1();   
  22.     Person personProxy = getOwnerPersonBeanProxy(person);   
  23.     System.out.println(personProxy.getName());    
  24.     try {   
  25.         personProxy.setRate(2);   
  26.     } catch (Exception e) {   
  27.         System.out.println("can not setRate");   
  28.     }   
  29.                  //   
  30.     Person person1 = getPersonBeanFromDB1();   
  31.     Person personProxy2 = getNonPersonBeanProxy(person1);   
  32.     System.out.println(personProxy2.getName());   
  33.     personProxy2.setRate(2);   
  34.     System.out.println(personProxy2.getRate());   
  35. }   
  36.   
  37. private Person getPersonBeanFromDB1(){   
  38.     Person pb = new PersonImpl();   
  39.     pb.setName("remy");   
  40.     pb.setGender("girl");   
  41.     pb.setRate(1);   
  42.     return pb;   
  43. }  

輸出結(jié)果:

Java代碼

 
 
 
 
  1. remy   
  2. can not setRate   
  3. remy   
  4. 2

網(wǎng)站題目:代理模式之Java動態(tài)代理
文章分享:http://www.5511xx.com/article/dhodiei.html