1. 程式人生 > >java動態代理(JDK和cglib)

java動態代理(JDK和cglib)

JAVA的動態代理 
代理模式 
代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的介面,代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後處理訊息等。代理類與委託類之間通常會存在關聯關係,一個代理類的物件與一個委託類的物件關聯,代理類的物件本身並不真正實現服務,而是通過呼叫委託類的物件的相關方法,來提供特定的服務。 
按照代理的建立時期,代理類可以分為兩種。 
靜態代理:由程式設計師建立或特定工具自動生成原始碼,再對其編譯。在程式執行前,代理類的.class檔案就已經存在了。 
動態代理:在程式執行時,運用反射機制動態建立而成。 

首先看一下靜態代理: 
1、Count.java 

  1. package net.battier.dao;  
  2. /** 
  3.  * 定義一個賬戶介面 
  4.  *  
  5.  * @author Administrator 
  6.  *  
  7.  */
  8. publicinterface Count {  
  9.     // 檢視賬戶方法
  10.     publicvoid queryCount();  
  11.     // 修改賬戶方法
  12.     publicvoid updateCount();  
  13. }  


2、CountImpl.java 

  1. package net.battier.dao.impl;  
  2. import net.battier.dao.Count;  
  3. /** 
  4.  * 委託類(包含業務邏輯) 
  5.  *  
  6.  * @author Administrator 
  7.  *  
  8.  */
  9. publicclass CountImpl implements Count {  
  10.     @Override
  11.     publicvoid queryCount() {  
  12.         System.out.println("檢視賬戶方法...");  
  13.     }  
  14.     @Override
  15.     publicvoid updateCount() {  
  16.         System.out.println("修改賬戶方法...");  
  17.     }  
  18. }  
  19. 、CountProxy.java  
  20. package net.battier.dao.impl;  
  21. import net.battier.dao.Count;  
  22. /** 
  23.  * 這是一個代理類(增強CountImpl實現類) 
  24.  *  
  25.  * @author Administrator 
  26.  *  
  27.  */
  28. publicclass CountProxy implements Count {  
  29.     private CountImpl countImpl;  
  30.     /** 
  31.      * 覆蓋預設構造器 
  32.      *  
  33.      * @param countImpl 
  34.      */
  35.     public CountProxy(CountImpl countImpl) {  
  36.         this.countImpl = countImpl;  
  37.     }  
  38.     @Override
  39.     publicvoid queryCount() {  
  40.         System.out.println("事務處理之前");  
  41.         // 呼叫委託類的方法;
  42.         countImpl.queryCount();  
  43.         System.out.println("事務處理之後");  
  44.     }  
  45.     @Override
  46.     publicvoid updateCount() {  
  47.         System.out.println("事務處理之前");  
  48.         // 呼叫委託類的方法;
  49.         countImpl.updateCount();  
  50.         System.out.println("事務處理之後");  
  51.     }  
  52. }  

3、TestCount.java 

  1. package net.battier.test;  
  2. import net.battier.dao.impl.CountImpl;  
  3. import net.battier.dao.impl.CountProxy;  
  4. /** 
  5.  *測試Count類 
  6.  *  
  7.  * @author Administrator 
  8.  *  
  9.  */
  10. publicclass TestCount {  
  11.     publicstaticvoid main(String[] args) {  
  12.         CountImpl countImpl = new CountImpl();  
  13.         CountProxy countProxy = new CountProxy(countImpl);  
  14.         countProxy.updateCount();  
  15.         countProxy.queryCount();  
  16.     }  
  17. }  

觀察程式碼可以發現每一個代理類只能為一個介面服務,這樣一來程式開發中必然會產生過多的代理,而且,所有的代理操作除了呼叫的方法不一樣之外,其他的操作都一樣,則此時肯定是重複程式碼。解決這一問題最好的做法是可以通過一個代理類完成全部的代理功能,那麼此時就必須使用動態代理完成。 
再來看一下動態代理: 
JDK動態代理中包含一個類和一個介面: 
InvocationHandler介面: 
public interface InvocationHandler { 
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 

引數說明: 
Object proxy:指被代理的物件。 
Method method:要呼叫的方法 
Object[] args:方法呼叫時所需要的引數 

可以將InvocationHandler介面的子類想象成一個代理的最終操作類,替換掉ProxySubject。 

Proxy類: 
Proxy類是專門完成代理的操作類,可以通過此類為一個或多個介面動態地生成實現類,此類提供瞭如下的操作方法: 
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, 
InvocationHandler h) 
                               throws IllegalArgumentException 
引數說明: 
ClassLoader loader:類載入器 
Class<?>[] interfaces:得到全部的介面 
InvocationHandler h:得到InvocationHandler介面的子類例項 

Ps:類載入器 
在Proxy類中的newProxyInstance()方法中需要一個ClassLoader類的例項,ClassLoader實際上對應的是類載入器,在Java中主要有一下三種類載入器; 
Booststrap ClassLoader:此載入器採用C++編寫,一般開發中是看不到的; 
Extendsion ClassLoader:用來進行擴充套件類的載入,一般對應的是jre\lib\ext目錄中的類; 
AppClassLoader:(預設)載入classpath指定的類,是最常使用的是一種載入器。 

動態代理 
與靜態代理類對照的是動態代理類,動態代理類的位元組碼在程式執行時由Java反射機制動態生成,無需程式設計師手工編寫它的原始碼。動態代理類不僅簡化了程式設計工作,而且提高了軟體系統的可擴充套件性,因為Java 反射機制可以生成任意型別的動態代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 介面提供了生成動態代理類的能力。 

動態代理示例: 
1、BookFacade.java 

  1. package net.battier.dao;  
  2. publicinterface BookFacade {  
  3.     publicvoid addBook();  
  4. }  

2、BookFacadeImpl.java 

  1. package net.battier.dao.impl;  
  2. import net.battier.dao.BookFacade;  
  3. publicclass BookFacadeImpl implements BookFacade {  
  4.     @Override
  5.     publicvoid addBook() {  
  6.         System.out.println("增加圖書方法。。。");  
  7.     }  
  8. }  
  9. 、BookFacadeProxy.java  
  10. package net.battier.proxy;  
  11. import java.lang.reflect.InvocationHandler;  
  12. import java.lang.reflect.Method;  
  13. import java.lang.reflect.Proxy;  
  14. /** 
  15.  * JDK動態代理代理類 
  16.  *  
  17.  * @author student 
  18.  *  
  19.  */
  20. publicclass BookFacadeProxy implements InvocationHandler {  
  21.     private Object target;  
  22.     /** 
  23. 相關推薦

    java動態代理JDKCGLIB筆記

    動態代理:為一堆interface或類的實現提供統一的執行通道,從含義上就像區域網電腦通過代理上網一樣,走統一的通道,代理控制通道,自然可以在通道里加上自定義實現,例如像AOP切面,日誌等。 JDK的動態代理只能對介面實現,代理類需要實現InvocationHandler 介面。 一、介面 pub

    java動態代理JDKcglib

    JAVA的動態代理  代理模式  代理模式是常用的java設計模式,他的特徵是代理類與委託類有同樣的介面,代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後處理訊息等。代理類與委託類之間通常會存在關聯關係,一個代理類的物件與一個委託類的物件關聯,代理類的物件本身並不真正實現服務,

    代理設計模式 靜態代理設計模式+ 動態代理JDKCglib

    一、代理設計模式 1、設計模式:前人總結一套解決特定問題的程式碼 2、代理設計模式優點:     2.1 保護真實物件     2.2 讓真實物件職責更明確     2.3 擴充套件 3、代理設計模式     3.1 真實物件(老總)     3.2 代理物件(祕書)     3.3 抽象物

    帶你用例項學習代理模式:靜態代理動態代理JDKCGlib以及區別優缺點

    Spring AOP的核心技術就是動態代理,所以小編學習並整理了代理模式的材料,供大家一起學習。 1、代理模式滿足的三個必要條件: 兩個角色:執行者、被代理物件 這個過程必須要做,但是自己不能做或者不想做,交給專業的人(媒婆) 執行者必須拿到被代理物件的引用(需要知道你要什

    Java動態代理JDK介面代理Cglib代理

    代理模式 代理模式是常用的java設計模式,它的特徵是代理類與委託類有同樣的介面,代理類主要負責為委託類預處理訊息、過濾訊息、把訊息轉發給委託類,以及事後處理訊息等。代理類與委託類之間通常會存在關聯關係,一個代理類的物件與一個委託類的物件關聯,代理類的物件本身並不真正實現服

    java 動態代理模式jdkcglib

    ref false spa err ast 反射 步驟 3.1 rate 1 package proxy.dynamicproxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.la

    JDK動態代理JDK dynamic proxy

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * JDK動態代理。 * @author Bright Le

    Java核心-反射動態代理JDK ProxyCglib

    反射和動態代理放有一定的相關性,但單純的說動態代理是由反射機制實現的,其實是不夠全面不準確的,動態代理是一種功能行為,而它的實現方法有很多。要怎麼理解以上這句話,請看下文。 一、反射 反射機制是 Java 語言提供的一種基礎功能,賦予程式在執行時 自省 (intro

    Java提高班反射動態代理JDK ProxyCglib

    反射和動態代理放有一定的相關性,但單純的說動態代理是由反射機制實現的,其實是不夠全面不準確的,動態代理是一種功能行為,而它的實現方法有很多。要怎麼理解以上這句話,請看下文。 一、反射 反射機制是 Java 語言提供的一種基礎功能,賦予程式在執行時自省(introspect,官方用語)的能力。通過反射我們可

    【轉載】Java動態代理JDK實現CGlib實現簡單易懂

          原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html       一:代理模式(靜態代理)           代理模式是常用設計模式的一種,我們在軟體設計時常用的代理一般是指靜態代理,也就是在程式碼中顯式指定的

    【八】Java設計模式GOF23之動態代理原生JDKCGLIB

    一、使用JDK原生動態代理 基於Java反射機制。 Java動態代理是基於介面的,如果物件沒有實現介面則選擇用CGLIB方式實現動態代理。 實現步驟: 1.首先實現一個InvocationHandler,方法呼叫會被轉發到該類的invoke()方法。 2.然後在需要

    Java動態代理JDK實現CGlib實現簡單易懂

    原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html 一:代理模式(靜態代理)           代理模式是常用設計模式的一種,我們在軟體設計時常用的代理一般是指靜態代理,也就是在程式碼中顯式指定的代理。      

    Java代理jdk靜態代理jdk動態代理cglib動態代理,aop,aspectj

    一.概念 代理是什麼呢?舉個例子,一個公司是賣攝像頭的,但公司不直接跟使用者打交道,而是通過代理商跟使用者打交道。如果:公司介面中有一個賣產品的方法,那麼公司需要實現這個方法,而代理商也必須實現這個方法。如果公司賣

    Spring—AOP兩種代理機制對比JDKCGLib動態代理

    Sprign 動態代理機制 Spirng的AOP的動態代理實現機制有兩種,分別是: 1)JDK動態代理: 具體實現原理: 1、通過實現InvocationHandlet介面建立自己的呼叫處理器 2、

    靜態代理動態代理jdk/cglib詳解

    ##### **1.靜態代理模式** ![](https://img2020.cnblogs.com/blog/1054413/202008/1054413-20200811114656604-915657843.png) 代理模式上,基本上有Subject角色,RealSubject角色,Proxy

    Java動態代理JDK實現CGlib實現

         原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html       一:代理模式(靜態代理)    &nbs

    動態代理及其兩種實現方式JDKCGLIB

    什麼是代理模式 為某物件提供一個代理,從而通過代理來訪問這個物件。 代理模式的角色組成 代理模式有三種角色組成: 抽象角色:通過介面或抽象類宣告真實角色實現的業務方法。 代理角色:實現抽象角色,是真實角色的代理,通過真實角色的業務邏輯方法來實現抽象

    談談java代理模式的認識二——動態代理JDK)

     讓我們就接著上篇部落格的靜態代理來開始今天的動態代理。 一、動態代理              靜態代理需要在執行之前就寫好代理類,這樣就造成了程式碼的大量重複,所以我們通過動態代理在執行時期動態生

    Java動態代理AOP

    [TOC] 動態代理(理解): 基於反射機制。 現在需要知道以下的就行: 1. 什麼是動態代理 ? 使用jdk的反射機制,建立物件的能力, 建立的是代理類的物件。 而不用你建立類檔案。不用寫java檔案。 動態:在程式執行時,呼叫jdk提供的方法才能建立代理類的物件。 jdk動態代理

    靜態編譯動態編譯libdll

    weibo docs p s 獎章 com 動態編譯 lan doc sin u2瓢剮JZP匪媳51http://www.docin.com/app/user/userinfo?userid=179185213 0宰9U拔7853E5噸渭3http://www.docin