欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java動態(tài)代理實現(xiàn)_動力節(jié)點Java學院整理-創(chuàng)新互聯(lián)

動態(tài)代理作為代理模式的一種擴展形式,廣泛應用于框架(尤其是基于AOP的框架)的設計與開發(fā),本文將通過實例來講解Java動態(tài)代理的實現(xiàn)過程。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,甘孜州企業(yè)網(wǎng)站建設,甘孜州品牌網(wǎng)站建設,網(wǎng)站定制,甘孜州網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,甘孜州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

通常情況下,代理模式中的每一個代理類在編譯之后都會生成一個class文件,代理類所實現(xiàn)的接口和所代理的方法都被固定,這種代理被稱之為靜態(tài)代理(Static Proxy)。那么有沒有一種機制能夠讓系統(tǒng)在運行時動態(tài)創(chuàng)建代理類?答案就是本文將要介紹的動態(tài)代理(Dynamic Proxy)。動態(tài)代理是一種較為高級的代理模式,它在事務管理、AOP(Aspect-OrientedProgramming,面向方面編程)等領(lǐng)域都發(fā)揮了重要的作用。

在傳統(tǒng)的代理模式中,客戶端通過Proxy類調(diào)用RealSubject類的request()方法,同時還可以在代理類中封裝其他方法(如preRequest()和postRequest()等)。如果按照這種方法使用代理模式,那么代理類和真實主題類都應該是事先已經(jīng)存在的,代理類的接口和所代理方法都已明確指定,如果需要為不同的真實主題類提供代理類或者代理一個真實主題類中的不同方法,都需要增加新的代理類,這將導致系統(tǒng)中的類個數(shù)急劇增加,因此需要想辦法減少系統(tǒng)中類的個數(shù)。動態(tài)代理可以讓系統(tǒng)能夠根據(jù)實際需要來動態(tài)創(chuàng)建代理類,讓同一個代理類能夠代理多個不同的真實主題類而且可以代理不同的方法。


從JDK 1.3開始,Java語言提供了對動態(tài)代理的支持,Java語言實現(xiàn)動態(tài)代理時需要用到位于java.lang.reflect包中的一些類,現(xiàn)簡要說明如下:


 (1) Proxy類


 Proxy類提供了用于創(chuàng)建動態(tài)代理類和實例對象的方法,它是所創(chuàng)建的動態(tài)代理類的父類,它最常用的方法如下:


  • public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces):該方法用于返回一個Class類型的代理類,在參數(shù)中需要提供類加載器并需要指定代理的接口數(shù)組(與真實主題類的接口列表一致)。
  • public static Object newProxyInstance(ClassLoader loader, Class<?>[]interfaces, InvocationHandler h):該方法用于返回一個動態(tài)創(chuàng)建的代理類的實例,方法中第一個參數(shù)loader表示代理類的類加載器,第二個參數(shù)interfaces表示代理類所實現(xiàn)的接口列表(與真實主題類的接口列表一致),第三個參數(shù)h表示所指派的調(diào)用處理程序類。

 (2) InvocationHandler接口


InvocationHandler接口是代理處理程序類的實現(xiàn)接口,該接口作為代理實例的調(diào)用處理者的公共父類,每一個代理類的實例都可以提供一個相關(guān)的具體調(diào)用處理者(InvocationHandler接口的子類)。在該接口中聲明了如下方法:


public Object invoke(Objectproxy, Method method, Object[] args):該方法用于處理對代理類實例的方法調(diào)用并返回相應的結(jié)果,當一個代理實例中的業(yè)務方法被調(diào)用時將自動調(diào)用該方法。invoke()方法包含三個參數(shù),其中第一個參數(shù)proxy表示代理類的實例,第二個參數(shù)method表示需要代理的方法,第三個參數(shù)args表示代理方法的參數(shù)數(shù)組。


動態(tài)代理類需要在運行時指定所代理真實主題類的接口,客戶端在調(diào)用動態(tài)代理對象的方法時,調(diào)用請求會將請求自動轉(zhuǎn)發(fā)給InvocationHandler對象的invoke()方法,由invoke()方法來實現(xiàn)對請求的統(tǒng)一處理。


下面通過一個簡單實例來學習如何使用動態(tài)代理模式:


Sunny軟件公司欲為公司OA系統(tǒng)數(shù)據(jù)訪問層DAO增加方法調(diào)用日志,記錄每一個方法被調(diào)用的時間和調(diào)用結(jié)果,現(xiàn)使用動態(tài)代理進行設計和實現(xiàn)。


本實例完整代碼如下所示:


import java.lang.reflect.Proxy; 
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
 
//抽象UserDAO:抽象主題角色 
interface AbstractUserDAO { 
  public Boolean findUserById(String userId); 
} 
 
//抽象DocumentDAO:抽象主題角色 
interface AbstractDocumentDAO { 
  public Boolean deleteDocumentById(String documentId); 
} 
 
//具體UserDAO類:真實主題角色 
class UserDAO implements AbstractUserDAO { 
  public Boolean findUserById(String userId) { 
    if (userId.equalsIgnoreCase("張無忌")) { 
      System.out.println("查詢ID為" + userId + "的用戶信息成功!"); 
      return true; 
    } 
    else { 
      System.out.println("查詢ID為" + userId + "的用戶信息失?。?); 
      return false; 
    } 
  } 
} 
 
//具體DocumentDAO類:真實主題角色 
class DocumentDAO implements AbstractDocumentDAO { 
  public Boolean deleteDocumentById(String documentId) { 
    if (documentId.equalsIgnoreCase("D001")) { 
      System.out.println("刪除ID為" + documentId + "的文檔信息成功!"); 
      return true; 
    } 
    else { 
      System.out.println("刪除ID為" + documentId + "的文檔信息失??!"); 
      return false; 
    } 
  } 
} 
 
//自定義請求處理程序類 
class DAOLogHandler implements InvocationHandler { 
  private Calendar calendar; 
  private Object object; 
   
  public DAOLogHandler() {   
  } 
   
  //自定義有參構(gòu)造函數(shù),用于注入一個需要提供代理的真實主題對象 
  public DAOLogHandler(Object object) { 
    this.object = object; 
  } 
   
  //實現(xiàn)invoke()方法,調(diào)用在真實主題類中定義的方法 
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
    beforeInvoke(); 
    Object result = method.invoke(object, args); //轉(zhuǎn)發(fā)調(diào)用 
    afterInvoke(); 
    return null; 
  } 
 
  //記錄方法調(diào)用時間 
  public void beforeInvoke(){ 
    calendar = new GregorianCalendar(); 
    int hour = calendar.get(Calendar.HOUR_OF_DAY); 
    int minute = calendar.get(Calendar.MINUTE); 
    int second = calendar.get(Calendar.SECOND); 
    String time = hour + ":" + minute + ":" + second; 
    System.out.println("調(diào)用時間:" + time); 
  } 
 
  public void afterInvoke(){ 
    System.out.println("方法調(diào)用結(jié)束!" ); 
  } 
} 

當前文章:Java動態(tài)代理實現(xiàn)_動力節(jié)點Java學院整理-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://chinadenli.net/article4/cephie.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設、手機網(wǎng)站建設、面包屑導航、做網(wǎng)站、服務器托管、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
色一欲一性一乱—区二区三区| 欧美不卡午夜中文字幕| 日韩一区二区三区在线欧洲| 国产成人综合亚洲欧美日韩| 亚洲国产av精品一区二区| 国产免费无遮挡精品视频| 亚洲国产丝袜一区二区三区四| 亚洲视频在线观看你懂的| 日韩亚洲激情在线观看| 91久久精品国产成人| 99久只有精品免费视频播放| 日本国产欧美精品视频| 久久一区内射污污内射亚洲| 无套内射美女视频免费在线观看 | 日韩综合国产欧美一区| 色婷婷视频国产一区视频| 欧美一级内射一色桃子| 天堂热东京热男人天堂| 日本中文在线不卡视频| 欧美午夜伦理在线观看| 日韩成人动画在线观看| 空之色水之色在线播放| 国产精品欧美在线观看| 久久青青草原中文字幕| 国产一区二区精品高清免费| 丰满少妇高潮一区二区| 太香蕉久久国产精品视频| 午夜精品福利视频观看| 最近中文字幕高清中文字幕无| 精品国产成人av一区二区三区| 伊人久久五月天综合网| 国产高清三级视频在线观看| 亚洲最新av在线观看| 欧美一区二区三区高潮菊竹| 在线观看视频日韩精品| 激情亚洲一区国产精品久久| 日韩一区二区三区高清在| 大尺度激情福利视频在线观看| 高清免费在线不卡视频| 熟女少妇久久一区二区三区| 日韩在线精品视频观看|