JAVA動態代理模式

JAVA動態代理模式

關鍵字: java動態代理模式

在目前的Java開發包中包含了對動態代理的支持,但是其實現只支持對接口的的實現。

  其實現主要通過是java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。

  Proxy類主要用來獲取動態代理對象,InvocationHandler接口用來約束調用者實現,如下,HelloWorld接口定義的業務方法,HelloWorldImpl是HelloWorld接口的實現,HelloWorldHandler是 InvocationHandler接口實現。代碼如下:

  業務接口:

         public interface HelloWorld {
  void sayHelloWorld() ;

  }

  業務接口實現:

         public class HelloWorldImpl implements HelloWorld {
  public void sayHelloWorld() {

  System.out.println("Hello World!");

  }

  }

  InvocationHandler實現,需要在接口方法調用前後加入一部份處理工作,這裏僅僅在方法調用前後向後臺輸出兩句字符串,其代碼如下:

  

      import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.Method;

  public class HelloWorldHandler implements InvocationHandler {

  //要代理的原始對象

  private Object objOriginal;

  /**

  * 構造函數。

  * @param obj 要代理的原始對象。

  */

  public HelloWorldHandler(Object obj) {

  this.objOriginal = obj ;

  }

  public Object invoke(Object proxy, Method method, Object[] args)

  throws Throwable {

  Object result ;

  //方法調用之前

  doBefore();

  //調用原始對象的方法

  result = method.invoke(this.objOriginal ,args);

  //方法調用之後

  doAfter();

  return result ;

  }

  private void doBefore() {

  System.out.println("before method invoke!");

  }

  private void doAfter() {

  System.out.println("after method invoke!");

  }

  }

 測試代碼:

         import java.lang.reflect.InvocationHandler;
  import java.lang.reflect.Proxy;

  public class Test {

  public static void main(String[] args) {

  HelloWorld hw = new HelloWorldImpl();

  InvocationHandler handler = new HelloWorldHandler(hw);

  HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(

  hw.getClass().getClassLoader(),

  hw.getClass().getInterfaces(),

  handler);

  proxy.sayHelloWorld();

  }

  }

  Ø 首先獲取一個業務接口的實現對象;

  Ø 獲取一個InvocationHandler實現,此處是HelloWorldHandler對象;

  Ø 創建動態代理對象;

  Ø 通過動態代理對象調用sayHelloWorld()方法,此時會在原始對象HelloWorldImpl. sayHelloWorld()方法前後輸出兩句字符串。

  運行測試類輸出如下:

  before method invoke!

  Hello World!

  after method invoke!

  此處Test類中的方法調用代碼比較多,在我們的實際應用中可以通過配置文件來來簡化客戶端的調用實現。另外也可以通過動態代理來實現簡單的AOP。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章