1.什麼是動態代理?
答:動態代理可以提供對另一個對象的訪問,同時隱藏實際對象的具體事實。代理一般會實現它所表示的實際對象的接口。代理可以訪問實際對象,但是延遲實現實際對象的部分功能,實際對象實現系統的實際功能,代理對象對客戶隱藏了實際對象。客戶不知道它是與代理打交道還是與實際對象打交道。
2.爲什麼使用動態代理?
答:因爲動態代理可以對請求進行任何處理
3.使用它有哪些好處?
答:因爲動態代理可以對請求進行任何處理
4.哪些地方需要動態代理?
答:不允許直接訪問某些類;對訪問要做特殊處理等
目前Java開發包中包含了對動態代理的支持,但是其實現只支持對接口的的實現。 其實現主要通過java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。
Proxy類主要用來獲取動態代理對象,InvocationHandler接口用來約束調用者實現
以下爲模擬案例,通過動態代理實現在方法調用前後向控制檯輸出兩句字符串
目錄結構
<br/>
定義一個HelloWorld接口
1 package com.ljq.test;
2
3 /**
4 * 定義一個HelloWorld接口
5 *
6 * @author jiqinlin
7 *
8 */
9 public interface HelloWorld {
10 public void sayHelloWorld();
11 }
類HelloWorldImpl是HelloWorld接口的實現
1 package com.ljq.test;
2
3 /**
4 * 類HelloWorldImpl是HelloWorld接口的實現
5 *
6 * @author jiqinlin
7 *
8 */
9 public class HelloWorldImpl implements HelloWorld{
10
11 public void sayHelloWorld() {
12 System.out.println("HelloWorld!");
13 }
14
15 }
HelloWorldHandler是 InvocationHandler接口實現
1 package com.ljq.test;
2
3 import java.lang.reflect.InvocationHandler;
4 import java.lang.reflect.Method;
5
6 /**
7 * 實現在方法調用前後向控制檯輸出兩句字符串
8 *
9 * @author jiqinlin
10 *
11 */
12 public class HelloWorldHandler implements InvocationHandler{
13 //要代理的原始對象
14 private Object obj;
15
16 public HelloWorldHandler(Object obj) {
17 super();
18 this.obj = obj;
19 }
20
21 /**
22 * 在代理實例上處理方法調用並返回結果
23 *
24 * @param proxy 代理類
25 * @param method 被代理的方法
26 * @param args 該方法的參數數組
27 */
28 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
29 Object result = null;
30 //調用之前
31 doBefore();
32 //調用原始對象的方法
33 result=method.invoke(obj, args);
34 //調用之後
35 doAfter();
36 return result;
37 }
38
39 private void doBefore(){
40 System.out.println("before method invoke");
41 }
42
43 private void doAfter(){
44 System.out.println("after method invoke");
45 }
46
47 }
測試類
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();
}
}
運行結果爲: