關於代理類的創建方式

<pre class="java" name="code"><pre class="java" name="code">/*代理,是什麼?
手機制造總部在北京,但客戶買手機不用到總部去購買,而是在本地商店就可以買到。而本地的商店就是代理。
在編寫程序時,如編好了類A,經過測序符合業務需求了,但爲了日後的維護,常常也需要一個,類B作爲代理。如日後想在類A前後添加一些系統功能,如果直接修改類A中的代碼,勢必會造成嚴重的後果,但是如果有一個代理類B,我們把新的系統功能寫好,往代理類中添加相應的系統功能即可,這樣就可以避免修改源代碼類A而造成的嚴重後果了。*/
class A{
public static void doit()
{
System.out.println("業務A被調用");
}
}
class B{
public static void doSomething()
{
//此處添加新的系統功能
A.doit();
//此處可以添加新的系統功能
}
}
<p>上面的代碼只是一個簡單的代理過程,但是如何獲取動態的代理類呢?獲取動態代理類有兩種方式,</p><p>第一種:通過=Proxy.getProxyClass(
    Collection.class.g獲取Proxy類的字節碼,再通過該Proxy的實例化對象獲取需代理類-----目標類的實例化對象,關鍵代碼如下:</p><p>Class classProxyetClassLoader(),           //此處的參數爲目標類的實現的接口的類加載器
    Collection.class                                     //此處的參數爲了目標接口的字節碼
    );</p><p>//獲取PRoxy的構造方法,該構造方法的參數爲InvocationHandler對象
  Constructor proxy=classProxy.getConstructor(InvocationHandler.class);
  //通過Proxy的構造方法獲取Collection的子類即目標類的實例化對象
  Collection instance=(Collection)proxy.newInstance(new InvocationHandler(){</p><p>
 //這是目標類,可以放在這裏,但這些寫是寫死的,不靈活,最好把它作爲參數傳進來,這樣比較靈活,纔是動態代理的思想  </p><p> Vector v=new Vector();
   @Override
   public Object invoke(Object proxy, Method method, Object[] args)
     throws Throwable {
    // TODO Auto-generated method stub
    Object retVal=method.invoke(v, args);
    return retVal;
   }
   
  });
  instance.add("bajf");
  instance.add("abnsdklyfhuwei");
  System.out.println(instance);</p><p>運行結果爲:</p><p>[bajf, abnsdklyfhuwei]
</p><p>第二種:直接通過Proxy類對象獲取動態代理類實例化對象</p><p>Collection collection=(Collection)Proxy.newProxyInstance(
    Collection.class.getClassLoader(),  //這裏接收的是目標類的接口類的類加載器
    new Class[]{Collection.class}       //這裏接收的是字節碼數組
    , 
    new InvocationHandler() {           //這裏接收的是InvocationHandler接口的實現類對象
      //這是目標類,可以放在這裏,但這些寫是寫死的,不靈活,最好把它作爲參數傳進來,這樣比較靈活,纔是動態代理的思想
     ArrayList arr=new ArrayList();     
     @Override
     public Object invoke(Object proxy, Method method, Object[] args)
       throws Throwable {
      // TODO Auto-generated method stub
      Object obj = method.invoke(arr, args);
      return obj;
     }
    }
    );
  collection.add("孫悟空");
  collection.add("豬八戒");
  System.out.println(collection);</p><p>運行結果爲:</p><p>[孫悟空, 豬八戒]</p>


 

 

以上兩種方法都可以獲取動態代理,但關於目標類我都把它寫死了,但爲了能讓廣大人民羣衆能看懂,我應該寫死。如果想要實現動態,請讀者按照上面的註釋自己嘗試完成,做出的動態代理,其實就是一個小小的框架了,但在做動態代理的同時如遇到困難,可以跟我分享,咱一起相互學習,謝謝

 

 

 

 

 

 

 


 

發佈了66 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章