深度剖析java中JDK動態(tài)代理機制-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!

創(chuàng)新互聯(lián)專注于洛寧企業(yè)網(wǎng)站建設,成都響應式網(wǎng)站建設,成都做商城網(wǎng)站。洛寧網(wǎng)站建設公司,為洛寧等地區(qū)提供建站服務。全流程按需求定制網(wǎng)站,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務

摘要

相比于靜態(tài)代理,動態(tài)代理避免了開發(fā)人員編寫各個繁鎖的靜態(tài)代理類,只需簡單地指定一組接口及目標類對象就能動態(tài)的獲得代理對象。

代理模式

深度剖析java中JDK動態(tài)代理機制

使用代理模式必須要讓代理類和目標類實現(xiàn)相同的接口,客戶端通過代理類來調(diào)用目標方法,代理類會將所有的方法調(diào)用分派到目標對象上反射執(zhí)行,還可以在分派過程中添加"前置通知"和后置處理(如在調(diào)用目標方法前校驗權(quán)限,在調(diào)用完目標方法后打印日志等)等功能。

使用動態(tài)代理的五大步驟

1.通過實現(xiàn)InvocationHandler接口來自定義自己的InvocationHandler; 

2.通過Proxy.getProxyClass獲得動態(tài)代理類 

3.通過反射機制獲得代理類的構(gòu)造方法,方法簽名為getConstructor(InvocationHandler.class) 

4.通過構(gòu)造函數(shù)獲得代理對象并將自定義的InvocationHandler實例對象傳為參數(shù)傳入 

5.通過代理對象調(diào)用目標方法 

動態(tài)代理的使用

例1(方式一)

public class MyProxy {

  public interface IHello{

    void sayHello();

  }

  static class Hello implements IHello{

    public void sayHello() {

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

    }

  }

  //自定義InvocationHandler

  static class HWInvocationHandler implements InvocationHandler{

    //目標對象

    private Object target;

    public HWInvocationHandler(Object target){

      this.target = target;

    }

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

      System.out.println("------插入前置通知代碼-------------");

      //執(zhí)行相應的目標方法

      Object rs = method.invoke(target,args);

      System.out.println("------插入后置處理代碼-------------");

      return rs;

    }

  }

  public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetExc  eption, InstantiationException {

    //生成$Proxy0的class文件

    System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

    //獲取動態(tài)代理類

    Class proxyClazz = Proxy.getProxyClass(IHello.class.getClassLoader(),IHello.class);

    //獲得代理類的構(gòu)造函數(shù),并傳入?yún)?shù)類型InvocationHandler.class

    Constructor constructor = proxyClazz.getConstructor(InvocationHandler.class);

    //通過構(gòu)造函數(shù)來創(chuàng)建動態(tài)代理對象,將自定義的InvocationHandler實例傳入

    IHello iHello = (IHello) constructor.newInstance(new HWInvocationHandler(new Hello()));

    //通過代理對象調(diào)用目標方法

    iHello.sayHello();

  }

} 

標題名稱:深度剖析java中JDK動態(tài)代理機制-創(chuàng)新互聯(lián)
文章分享:http://muchs.cn/article24/dhecce.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、搜索引擎優(yōu)化、自適應網(wǎng)站、軟件開發(fā)、靜態(tài)網(wǎng)站、網(wǎng)站設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)