更詳細的參考:http://blog.csdn.net/lovelion/article/details/8116704html
1.什麼是動態代理?java
答:動態代理能夠提供對另外一個對象的訪問,同時隱藏實際對象的具體事實。代理通常會實現它所表示的實際對象的接口。代理能夠訪問實際對象,可是延遲實現實際對象的部分功能,實際對象實現系統的實際功能,代理對象對客戶隱藏了實際對象。客戶不知道它是與代理打交道仍是與實際對象打交道。
2.爲何使用動態代理?數組
答:由於動態代理能夠對請求進行任何處理post
3.使用它有哪些好處?測試
答:由於動態代理能夠對請求進行任何處理
4.哪些地方須要動態代理?this
答:不容許直接訪問某些類;對訪問要作特殊處理等url
目前Java開發包中包含了對動態代理的支持,可是其實現只支持對接口的的實現。 其實現主要經過java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。 spa
Proxy類主要用來獲取動態代理對象,InvocationHandler接口用來約束調用者實現.net
如下爲模擬案例,經過動態代理實如今方法調用先後向控制檯輸出兩句字符串代理
目錄結構
定義一個HelloWorld接口
package com.ljq.test; /** * 定義一個HelloWorld接口 * * @author jiqinlin * */ public interface HelloWorld { public void sayHelloWorld(); }
類HelloWorldImpl是HelloWorld接口的實現
package com.ljq.test; /** * 類HelloWorldImpl是HelloWorld接口的實現 * * @author jiqinlin * */ public class HelloWorldImpl implements HelloWorld{ public void sayHelloWorld() { System.out.println("HelloWorld!"); } }
HelloWorldHandler是 InvocationHandler接口實現
package com.ljq.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 實如今方法調用先後向控制檯輸出兩句字符串 * * @author jiqinlin * */ public class HelloWorldHandler implements InvocationHandler{ //要代理的原始對象 private Object obj; public HelloWorldHandler(Object obj) { super(); this.obj = obj; } /** * 在代理實例上處理方法調用並返回結果 * * @param proxy 代理類 * @param method 被代理的方法 * @param args 該方法的參數數組 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; //調用以前 doBefore(); //調用原始對象的方法 result=method.invoke(obj, args); //調用以後 doAfter(); return result; } private void doBefore(){ System.out.println("before method invoke"); } private void doAfter(){ System.out.println("after method invoke"); } }
測試類
package com.ljq.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class HelloWorldTest { public static void main(String[] args) { HelloWorld helloWorld=new HelloWorldImpl(); InvocationHandler handler=new HelloWorldHandler(helloWorld); //建立動態代理對象 HelloWorld proxy=(HelloWorld)Proxy.newProxyInstance( helloWorld.getClass().getClassLoader(), helloWorld.getClass().getInterfaces(), handler); proxy.sayHelloWorld(); } }
運行結果爲: