黑馬程式員-Java的代理

來源:互聯網
上載者:User

---------------------- android培訓、java培訓、期待與您交流! ----------------------

Java的代理又是一個我覺得學了之後不得不發表一下的知識。

首先說一下什麼是代理,引用張老師的說法,就像賣聯想電腦的代理店,聯想電腦的總部在北京(這個不知道是不是真的,聽張老師說的),而我在廣州,而我又想買個聯想的電腦,這時我有兩種選擇,一種是走車到北京買,一種是在廣州的聯想代理店買,顯然很多人會選擇第二種方式,這也就是為什麼會有代理,為什麼需要代理,代理的作用。

代理模式就是為其他對象提供一個代理以控制這個對象的訪問,在某些情況下,一個客戶不想或不能直接引用另一個對象,而代理對象可以在客戶和目標對象之間提供一個中介的作用。

代理可以分兩種,一種是靜態代理,另一種是動態代理。

靜態代理一般就是繼承某個需要代理的類,然後重寫他的方法,在這個基礎上稍作修改,達到我們想要的目的,但是這種方法一般是很麻煩的,如果該類的方法很多,那麼實現起來就很麻煩了。所以一般很少用到,下面介紹動態代理。

說到動態代理Proxy,不得不提一個介面InvacationHandler,要實現動態代理必須實現InvocationHandler介面,該介面只定義了一個方法public Object invoke(Object obj, Methodmethod, Object [] objs),其中obj是指代理類,第二個參數method指被代理的方法,第三個參數objs指被代理方法的參數數組,通過實現介面重寫invoke方法,我們就可以實現被代理的方法的修改,增加一些屬性,例如我們要對寫一個ArrayList的代理,對他們方法增加顯示方法執行的時間(還是張老師提供的例子,進行了改寫),可以想定義一個代理類:

class ArrayListProxy{private Object obj;public Object bind (Object obj){this.obj = obj;return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler(){public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {long begintime = System.currentTimeMillis();Object ral = method.invoke(ArrayListProxy.this.obj, args);long endtime = System.currentTimeMillis();System.out.println(method.getName()+"() the runtime is "+ (endtime - begintime));return ral;}});}}

 

類中的方法提供一個參數,傳入的參數是被代理的類,ArrayListProxy 類就可以返回該類代理的引用(這個類太牛逼了),然後是測試

public static void main(String[] args){ArrayList al = new ArrayList();ArrayListProxy alp = new ArrayListProxy();Collection proxy = (Collection) alp.bind (al);proxy.add("aaaaaa");proxy.add("bbbbbb");proxy.add("ccccccc");System.out.println(proxy.size());} 

但是上面的例子中你可能就主要到了動態代理的一個問題,就是實現的代理類其實只是介面的代理,想上面的例子,是Collection介面的代理,那麼究竟有沒有其他方法呢,很慚愧,沒想到,最多隻能一個一個實現ArrayList所實現的介面的代理,這還是有點麻煩。不知道有沒有其他方法,可惜我暫時沒找到,很鬱悶。

 

---------------------- android培訓、java培訓、期待與您交流! ----------------------
詳細請查看:edu.csdn.net/heima

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.