欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java動(dòng)態(tài)代理示例分享

 更新時(shí)間:2014年02月17日 14:14:45   作者:  
這篇文章主要介紹了java動(dòng)態(tài)代理示例,需要的朋友可以參考下

首先分析動(dòng)態(tài)代理模式中的3個(gè)角色:
1.抽象角色:static proxy中它可以為抽象類,但是dynamic proxy中它只能是接口
2.真實(shí)角色:就是實(shí)現(xiàn)了抽象角色中的方法罷了
3.代理角色:最惡心的就是動(dòng)態(tài)代理里面的這個(gè)代理角色了。它要持有真實(shí)角色的引用。

它涉及到一個(gè)接口和一個(gè)類,InvocationHandler接口和Proxy類。根據(jù)JDK文檔說,InvocationHandler接口是要被一個(gè)類實(shí)現(xiàn)的,這個(gè)類的實(shí)例是一個(gè)代理對(duì)象對(duì)應(yīng)的handler對(duì)象。當(dāng)代理對(duì)象的一個(gè)方法被調(diào)用,則會(huì)把該方法編碼并分配給它對(duì)應(yīng)的handler對(duì)象的invoke方法中去調(diào)用!

復(fù)制代碼 代碼如下:

//抽象角色:
public interface AbstractRole
{
public void show();
}

//真實(shí)角色:

public class RealRole implements AbstractRole

{

@Override

public void show(){ System.out.println("show me your house"); }

}

//代理角色:

//我覺得這只是一個(gè)偽代理罷了,偽代理是我自己想出來的= =!,因?yàn)樗鼘?shí)際是代理對(duì)應(yīng)的handler

public class Handler implements InvocationHandler

{

private Object realRole; // 代理角色中需要有真實(shí)角色的引用,定義為Object類型則通用

public Handler(Object realRole)

{ this.realRole = realRole; }

@Override

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

{

System.out.println("Give me your money");  // 這是代理角色自己添加的額外功能罷了

method.invoke(this.realRole, args); //通過反射調(diào)用真實(shí)角色的方法

System.out.println("Ok...house is yours");//這是代理角色自己添加的額外功能罷了
}

public Object factory()//通過工廠方法生成真正的代理角色

{
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); //Proxy中的newProxyInstance方法有兩個(gè)很重要的特點(diǎn)!第一是動(dòng)態(tài)創(chuàng)建一個(gè)代理類,若輸出好像是名叫$Proxy0的類;第二是通過動(dòng)態(tài)創(chuàng)建的這個(gè)類生成一個(gè)實(shí)例。
}
}

//客戶端:
public class Test

{

   public static void main(String[] args)

  {
     RealRole realRole = new RealRole();//想要代理哪一個(gè)真實(shí)角色就new出這個(gè)真實(shí)角色

     Handler handler = new Handler(realRole);//這里產(chǎn)生了代理類對(duì)應(yīng)的handler了,我也想叫他偽代理對(duì)象

     AbstractRole proxy = (AbstractRole)handler.factory();//通過工廠方法產(chǎn)生代理對(duì)象
  }

}

以上也許會(huì)想這里代理角色怎么能強(qiáng)轉(zhuǎn)為抽象角色呢?原因在于newProxyInstance方法,這個(gè)方法太interesting了~就如上面說的,它會(huì)自動(dòng)產(chǎn)生一個(gè)類,然后通過類產(chǎn)生代理對(duì)象。其實(shí)這個(gè)類就實(shí)現(xiàn)了抽象角色類了,為什么?因?yàn)榈诙€(gè)參數(shù)已經(jīng)指明了它實(shí)現(xiàn)哪些接口了。所以可以強(qiáng)轉(zhuǎn)了,強(qiáng)轉(zhuǎn)之后就可以調(diào)用抽象角色中的方法了

proxy.show();//好!注意這句了,我在最開始有紅體字標(biāo)出來,“會(huì)把該方法編碼并分配給它對(duì)應(yīng)的handler對(duì)象的invoke方法中去調(diào)用!” 就因?yàn)檫@句話,所以proxy.show()就是把show方法傳到了handler對(duì)象中的invoke方法中去了,當(dāng)然也跟著show方法的參數(shù)了,不過這里show方法沒有參數(shù)。所以proxy.show()這句話實(shí)際就是調(diào)用了handler對(duì)象中的invoke方法。

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)與算法之單鏈表深入理解

    Java數(shù)據(jù)結(jié)構(gòu)與算法之單鏈表深入理解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之單鏈表深入理解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Spring Cloud Zuul自定義過濾器的實(shí)現(xiàn)

    Spring Cloud Zuul自定義過濾器的實(shí)現(xiàn)

    這篇文章主要介紹了自定義Spring Cloud Zuul過濾器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java中的分割字符串?split(“.”)無效問題

    Java中的分割字符串?split(“.”)無效問題

    這篇文章主要介紹了Java中的分割字符串?split(“.”)無效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 實(shí)例詳解Java中如何對(duì)方法進(jìn)行調(diào)用

    實(shí)例詳解Java中如何對(duì)方法進(jìn)行調(diào)用

    這篇文章主要介紹了實(shí)例詳解Java中如何對(duì)方法進(jìn)行調(diào)用,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • 聊聊Lombok中的@Builder注解使用教程

    聊聊Lombok中的@Builder注解使用教程

    @Builder注解的作用主要是用來生成對(duì)象,并且可以為對(duì)象鏈?zhǔn)劫x值。接下來通過本文給大家介紹Lombok中的@Builder注解使用教程,感興趣的朋友一起看看吧
    2021-11-11
  • Spring Properties的使用和配置方法

    Spring Properties的使用和配置方法

    這篇文章主要介紹了Spring Properties的使用和配置方法,本文不是原理分析、源碼分析文章,只是希望可以幫助讀者更好地理解和使用 Spring Properties,有興趣的可以了解一下
    2018-01-01
  • Jexcel實(shí)現(xiàn)按一定規(guī)則分割excel文件的方法

    Jexcel實(shí)現(xiàn)按一定規(guī)則分割excel文件的方法

    這篇文章主要介紹了Jexcel實(shí)現(xiàn)按一定規(guī)則分割excel文件的方法,涉及java操作Excel文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • springBoot項(xiàng)目打包idea的多種方法

    springBoot項(xiàng)目打包idea的多種方法

    這篇文章主要介紹了springBoot項(xiàng)目打包idea的多種方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • IDEA中使用Typora編輯md文件的方法

    IDEA中使用Typora編輯md文件的方法

    這篇文章主要介紹了IDEA中使用Typora編輯md文件的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java StringTokenizer分隔符拆分字符串

    Java StringTokenizer分隔符拆分字符串

    Java中的StringTokenizer類用于將一個(gè)字符串分解成標(biāo)記,本文主要介紹了Java StringTokenizer分隔符拆分字符串,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08

最新評(píng)論