一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java動態代理示例分享

java動態代理示例分享

2019-11-06 11:43java教程網 JAVA教程

這篇文章主要介紹了java動態代理示例,需要的朋友可以參考下

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

它涉及到一個接口和一個類,InvocationHandler接口和Proxy類。根據JDK文檔說,InvocationHandler接口是要被一個類實現的,這個類的實例是一個代理對象對應的handler對象。當代理對象的一個方法被調用,則會把該方法編碼并分配給它對應的handler對象的invoke方法中去調用!

 

復制代碼代碼如下:


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

 

//真實角色:

public class RealRole implements AbstractRole

{

@Override

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

}

//代理角色:

//我覺得這只是一個偽代理罷了,偽代理是我自己想出來的= =!,因為它實際是代理對應的handler

public class Handler implements InvocationHandler

{

private Object realRole; // 代理角色中需要有真實角色的引用,定義為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); //通過反射調用真實角色的方法

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

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

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

//客戶端:
public class Test

{

   public static void main(String[] args)

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

     Handler handler = new Handler(realRole);//這里產生了代理類對應的handler了,我也想叫他偽代理對象

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

}

 

以上也許會想這里代理角色怎么能強轉為抽象角色呢?原因在于newProxyInstance方法,這個方法太interesting了~就如上面說的,它會自動產生一個類,然后通過類產生代理對象。其實這個類就實現了抽象角色類了,為什么?因為第二個參數已經指明了它實現哪些接口了。所以可以強轉了,強轉之后就可以調用抽象角色中的方法了

proxy.show();//好!注意這句了,我在最開始有紅體字標出來,“會把該方法編碼并分配給它對應的handler對象的invoke方法中去調用!” 就因為這句話,所以proxy.show()就是把show方法傳到了handler對象中的invoke方法中去了,當然也跟著show方法的參數了,不過這里show方法沒有參數。所以proxy.show()這句話實際就是調用了handler對象中的invoke方法。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国内久久精品视频 | 99毛片| 紧身裙女教师miad711在线 | 视频在线播放 | 高清国产欧美一v精品 | 91真人毛片一级在线播放 | 女同69式互添在线观看免费 | 国产亚洲精品一区二区在线播放 | 国产精品亚洲片在线不卡 | 天天色综合久久 | 美女被扒开屁股进去网 | 黑帮少爷爱上我第8集在线观看 | bedfriend泰剧全集免费观看 | 日韩欧美一区二区三区中文精品 | 男男按摩1069gⅴ | 国产精品免费aⅴ片在线观看 | 好大好猛好爽好深视频免费 | 国产丰满美女做爰 | 欧美一级特黄aaa大片 | 5555kkkk香蕉在线观看 | 哇嘎在线精品视频在线观看 | 男人猛进猛出女人下面视频 | 午夜在线播放免费人成无 | 久久亚洲国产成人影院 | 网站国产 | 亚洲精品一区二区久久久久 | 国产精品青青青高清在线 | 国产欧美一区二区精品性色 | 乳女教师欲乱动漫无修版动画3d | 欧美精品日韩一区二区三区 | 国产成人性毛片aaww | 亚洲区精品久久一区二区三区 | 91国内精品久久久久怡红院 | 男男同志videos| 四虎私人影院 | 韩国激情网 | 欧美一级免费看 | meyd–456佐山爱在线播放 | 精品久久日日躁夜夜躁AV | 国产福利你懂的 | 免费毛片在线观看 |