JAVA 動態代理

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(); } }
複製代碼

運行結果爲:

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