真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

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

摘要

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

代理模式

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

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

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

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

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

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

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

5.通過代理對象調(diào)用目標(biā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{

    //目標(biāo)對象

    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í)行相應(yīng)的目標(biāo)方法

      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)用目標(biāo)方法

    iHello.sayHello();

  }

} 

分享文章:深度剖析java中JDK動態(tài)代理機(jī)制-創(chuàng)新互聯(lián)
新聞來源:http://weahome.cn/article/dhecce.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部