1. 程式人生 > >Java動態代理的應用

Java動態代理的應用

先看一下代理模式,類圖(如果要深究java代理是模式,設計的原理比較複雜,建議參考相關書籍和文章,這裡不展開闡述)

代理模式類圖

  代理模式最大的特點就是代理類和實際業務類實現同一個介面(或繼承同一父類),代理物件持有一個實際物件的引用,外部呼叫時操作的是代理物件,而在代理物件的內部實現中又會去呼叫實際物件的操作

 Java動態代理其實內部也是通過Java反射機制來實現的,即已知的一個物件,然後在執行時動態呼叫其方法,這樣在呼叫前後作一些相應的處理,這樣說的比較籠統,舉個簡單的例子

   比如我們在應用中有這樣一個需求,在對某個類的一個方法的呼叫前和呼叫後都要做一下日誌操作,

一個普通的介面

  1. publicinterface AppService {  
  2.       publicboolean createApp(String name);  
  3. }  
 

該介面的預設實現類

  1. publicclass AppServiceImpl implements AppService {  
  2.     publicboolean createApp(String name) {  
  3.         System.out.println("App["+name+"] has been created.");  
  4.         returntrue;  
  5.     }  
  6. }  
 

日誌處理器

  1. publicclass LoggerInterceptor implements InvocationHandler {//注意實現這個Handler介面
  2.     private Object target;//目標物件的引用,這裡設計成Object型別,更具通用性
  3.     public LoggerInterceptor(Object target){  
  4.         this.target = target;  
  5.     }  
  6.     public Object invoke(Object proxy, Method method, Object[] arg)  
  7.             throws
     Throwable {  
  8.         System.out.println("Entered "+target.getClass().getName()+"-"+method.getName()+",with arguments{"+arg[0]+"}");  
  9.         Object result = method.invoke(target, arg);//呼叫目標物件的方法
  10.         System.out.println("Before return:"+result);  
  11.         return result;  
  12.     }  
  13. }  

外部呼叫

  1. publicclass Main {  
  2.     publicstaticvoid main(String[] args) {  
  3.         AppService target = new AppServiceImpl();//生成目標物件
  4.         //接下來建立代理物件
  5.         AppService proxy = (AppService) Proxy.newProxyInstance(  
  6.                 target.getClass().getClassLoader(),  
  7.                 target.getClass().getInterfaces(), new LoggerInterceptor(target));  
  8.         proxy.createApp("Kevin Test");  
  9.     }  
  10. }