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