設計模式之Dynamic Proxy-動態代理

來源:互聯網
上載者:User

 

動態代理(Dynamic Proxy)是JDK5 提供的一種新特性。其特點在於在程式的運行時刻動態建立出代理類及其對象,而不像我們使用靜態代理時必須在編譯之前定義好代理類。在運行時刻,架構幫我們動態建立出一個實現了多個介面的代理類,每個代理類的對象都會和一個InvocationHandler介面的實作類別相關聯。當我們調用了代理對象所代理的介面中的方法的時候,這個調用的資訊會被傳遞給InvocationHandler的invoke方法。在 invoke方法的參數中可以擷取到代理對象、方法對應的Method對象和調用的實際參數(內部是通過反射來實現的)。 invoke方法的傳回值被返回給使用者,至於返回什麼值可以由自己來定義,這種做法實際上相當於對方法調用進行了AOP攔截。 

  建立動態代理的步驟如下: 1. 建立一個實現介面InvocationHandler的類,它必須實現invoke方法。 2. 建立被代理類以及介面 3. 通過Proxy的靜態方法newProxyInstance(ClassLoader loader,  Class<?>[] interfaces, InvocationHandler h)建立一個代理 4. 通過代理來調用方法(此代理實現了被代理類的介面)
/** * DynamicSubject.java * dynamicproxy * * Function: 動態代理類, java.lang.reflect.Proxy 是運行時產生的Class,在產生它的時候你必須傳遞 * 一組Interfaces給它(多個介面),然後返回的對象就實現了這些介面,這個Proxy就是一個純粹的Porxy, * 所以我們必須提供一個InvocationHandler,由它來接替 * *   ver     date      author * ────────────────────────────────── *    2011-6-12 Leon * * Copyright (c) 2011, TNT All Rights Reserved.*/ package dynamicproxy; import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy; /** * ClassName:DynamicSubject * Function: TODO ADD FUNCTION * 建立動態代理的步驟如下: * 1. 建立一個實現介面InvocationHandler的類,它必須實現invoke方法。 * 2. 建立被代理類以及介面 * 3. 通過Proxy的靜態方法newProxyInstance(ClassLoader loader, *        Class[] interfaces, InvocationHandler h)建立一個代理 * 4. 通過代理來調用方法(此代理實現了被代理類的介面) * * * Reason: TODO ADD REASON * * @author   Leon * @version * @since    Ver 1.1 * @Date 2011-6-12 */public class DynamicProxy implements InvocationHandler { private Object sub ;  public Object getSub() {return sub;}public void setSub(Object sub) {this.sub = sub;}public DynamicProxy(Object obj){this.sub=obj;}//proxy是架構動態產生的代理類@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable { // TODO Auto-generated method stubObject result = null ;System.out.println("before calling: " +  method); //此處是真正被代理的對象result=method.invoke(sub, args); System.out.println("after calling ..."); return result;} public static void main(String...  args){ RealSubject  realSubject = new RealSubject(); DynamicProxy dynamicProxy = new DynamicProxy(realSubject); //InvocationHandler invocationHandler = dynamicProxy; //動態產生一個代理對象,返回的對象既不是RealSubject執行個體也不是DynamicPorxy的執行個體,而是動態產生//的一個執行個體 $prxoy0,它實現了realSubject.getClass().getInterfaces()這些介面ISubject subject=(ISubject)Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(),  realSubject.getClass().getInterfaces(),dynamicProxy); //當調用這一句的時候,$proxy0就會調用上面傳入的invocationHandler的invoke方法,所以上面的方法要傳入invocationHandler。System.out.println("--------------------------Porxy realSubject1 ------------------------------------");subject.request();String result=subject.test();System.out.println("return by test method :" + result);System.out.println("--------------------------Proxy realSubject2--------------------------------------");dynamicProxy.setSub(new RealSubject2());subject.request(); System.out.println("proxy generate by system is :"+subject.getClass()); } } interface ISubject {public void request();    public String test();} class RealSubject implements ISubject { @Overridepublic void request() { // TODO Auto-generated method stubSystem.out.println("From  real  subject...request method....");} @Overridepublic String test() { // TODO Auto-generated method stubString str ="From real subject.....test  method.....";return  str ;  }} class RealSubject2 implements ISubject { @Overridepublic void request() { // TODO Auto-generated method stubSystem.out.println("From  real  subject2...request method....");} @Overridepublic String test() { // TODO Auto-generated method stubSystem.out.println("From real subject2 .....test  method.....");return null ;}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.