Java 動態代理

來源:互聯網
上載者:User

標籤:art   inf   為什麼   而在   區別   handle   out   class   blog   

  1、代理模式

  從設計模式的角度看,代理模式用於解耦兩個對象,代理作為中介橋接客戶(調用者)和商務邏輯類。通常代理是已存在的類,它被JVM載入到記憶體後執行個體化並使用,也可以在運行時動態產生,從而使得代理的應用更加靈活。其目的就是為其他對象提供一個代理以控制對某個對象的訪問。代理類負責為委託類預先處理訊息,過濾訊息並轉寄訊息,以及進行訊息被委託類執行後的後續處理。

  為了保持行為的一致性,代理類和委託類通常會實現相同的介面,所以在訪問者看來兩者沒有絲毫的區別(透明的)。通過代理類這中間一層,能有效控制對委託類對象的直接存取,也可以很好地隱藏和保護委託類對象,同時也為實施不同控制策略預留了空間,從而在設計上獲得了更大的靈活性。如代理對象則可以封裝一些內部的處理邏輯(一些新增的功能如存取控制、日誌、緩衝、授權等)。

  Java 動態代理機制以巧妙的方式近乎完美地實踐了代理模式的設計理念。

 

  2、傳統的代理模式

  在客戶類(調用者)和商務邏輯類(被調用者,被代理者)之間添加附加的類Proxy(代理者,一般會和被代理者實現相同的介面),實現傳統代理模式。

  如中的代理類Proxy和Car都實現了IVehicle介面:

public class VehicleProxy implements IVehicle{    private IVehicle v;    public VehicleProxy(IVehicle v){this,v=v;}    public void start(){    System.out,println(“VehicleProxy之前”);    v.start();    System.out,println(“VehicleProxy之後”);    }    //stop(), forward(), …}

  3、動態代理的原理

  JDK5引入了動態代理。允許開發人員在運行時刻隨時隨地建立出代理類及其對象,動態建立出實現多個介面的代理類,每個代理對象關聯一個表示內部處理邏輯的InvocationHandler介面的實現。

  當客戶調用代理對象所代理介面中的方法時,調用資訊會被傳遞給InvocationHandler介面的invoke()方法。invoke()方法的參數中可以擷取到代理對象、方法對應的Method對象和調用的實際參數,其傳回值被返回給使用者(是誰?)。

  這種做法相當於對方法調用進行了攔截,AOP就是基於這一思想的實現架構。

  

  4、動態代理的實現

  若使用動態代理實現同樣的功能,首先要定義實現InvocationHandler介面的類VehicleHandler。

  定義了動態代理後,用戶端的調用方式

  這裡看似沒有產生好處,還要編寫調用處理類(Invocation Handler),那麼為什麼還要使用動態代理?是為了產生通用委託類(添加日誌等功能)~

  

  5、解析Proxy類中public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,  InvocationHandler h)方法:

/*將VehicleHandler綁定給IVehicle介面*/ClassLoader cl=IVehicle.class.getClassLoader();IVehicle v=(IVehicle) Proxy.newProxyInstance(    cl,new Class[]{IVehicle.class},    new VehicleHandler(Ivehicle c)    );

  這個方法Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler.

  (它返回指定介面的代理類的執行個體對象,這個(代理類?)將方法調用指派給指定的調用處理常式)

  loader, the class loader to define the proxy class.

  interfaces, the list of interfaces for the proxy class to implement.

  h , the invocation handler to dispatch method invocations to a proxy instance with the specified invocation handler of a proxy class that is defined by the specified class loader and that implements the specified interfaces.

   

  6、關於ClassLoader類

  ClassLoader類就是用來動態載入class檔案到記憶體當中用的。

  當我們寫好一個Java程式之後,不是管是CS還是BS應用,都是由若干個.class檔案組織而成的一個完整的Java應用程式,當程式在運行時,即會調用該程式的一個入口函數來調用系統的相關功能,而這些功能都被封裝在不同的class檔案當中,所以經常要從這個class檔案中要調用另外一個class檔案中的方法,如果另外一個檔案不存在的,則會引發系統異常。

  而程式在啟動的時候,並不會一次性載入程式所要用的所有class檔案,而是根據程式的需要,通過Java的類載入機制(ClassLoader)來動態載入某個class檔案到記憶體當中的,從而只有class檔案被載入到了記憶體之後,才能被其它class所引用。所以ClassLoader就是用來動態載入class檔案到記憶體當中用的。

  

 

Java 動態代理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.