1. 程式人生 > >對Java代理模式的理解

對Java代理模式的理解

java proxy 代理 反射

Java的代理分為靜態代理和動態代理。

靜態代理模式的構成:1.一個共同的接口或抽象類 2.真實的類 3.代理類

其中真實類和代理類都實現了那個共同的接口,代理類內部有一個對真實類對象的引用,用戶使用代理類時,實際會調用真實對象的對應方法。

靜態代理的局限在於 1.有一個真實類就要構造一個代理類,類的數量會急劇增加。2. 在編寫代碼時若沒有確定需要被代理的真實類,是不能編寫代理類的。


動態代理:是為了解決靜態代理的缺陷而出現的。它的使用方法是這樣的:

用戶需要使用Java提供的Proxy類動態創建一個代理類,並使用這個代理類實現相應功能。對於一個代理類來說,首先它需要知道它要代理的類是什麽,Proxy類的newProxyInstance()方法中的參數好像並沒有提供這樣的信息,其實這個信息存在於它的第三個參數InvocationHandler裏面。InvocationHandler負責實際的方法調用,在實現了InvocationHandler接口的類裏一定有一個成員變量來存儲真實類的實例,而對真實類方法的調用則是通過invoke方法裏的method參數來實現的。形如這樣的形式:

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
  System.out.println("before calling: " + method);
  if (null != args) {
    for (Object obj : args) {
      System.out.println(obj);
    }
  }
  Object object = method.invoke(proxyObj, args);
  System.out.println("after calling: " + method);
  return object;
}

這裏InvacationHandler就是真實類和代理類之間的橋梁,代理類的對象在動態生成時只聲稱自己實現了某一組接口,這組接口應和真實類所實現的接口一致,這是由代理的性質所決定的。真實類被封裝在了handler裏,handler的invoke方法利用Java的反射機制就可以調用真實類的方法。動態代理具有很強的靈活性。首先,我們不再特意為某一個類創建代理類,代理類是動態生成的,同時對於只有在運行時才能確定真實類的場合,可以在運行時由handler來動態獲取真實類解決。

本文出自 “木葉的思考” 博客,請務必保留此出處http://muye12921.blog.51cto.com/5008231/1970245

對Java代理模式的理解