隨筆:93 文章:11 評論:22 引用:0
My Rhythm
萬物皆對象 萬事歸節奏
首頁
發新隨筆
發新文章
聯系
聚合
管理
[轉]Java 靜態代理和動態代理
載自http://kuangbaoxu.javaeye.com/blog/192804
1. 代理模式主要有兩種:靜態代理和動態代理
2. 靜態代理:
比如要在輸出“HelloWorld”前打印一個字符串“Welcome”
A:先定義一個接口類
1
package
ttitfly.proxy;
2
3
public
interface
HelloWorld
{
4
public
void
print();
5
//
public void say();
6
}
B: 定義一個該接口的實現類
java 代碼
1
package
ttitfly.proxy;
2
3
public
class
HelloWorldImpl
implements
HelloWorld
{
4
5
public
void
print()
{
6
System.out.println(
"
HelloWorld
"
);
7
}
8
//
public void say(){
9
//
System.out.println("Say Hello!");
10
//
}
11
}
C:定義一個靜態代理類
1
package
ttitfly.proxy;
2
3
public
class
StaticProxy
implements
HelloWorld
{
4
5
public
HelloWorld helloWorld ;
6
public
StaticProxy(HelloWorld helloWorld)
{
7
this
.helloWorld
=
helloWorld;
8
}
9
10
public
void
print()
{
11
System.out.println(
"
Welcome
"
);
12
//
相當于回調
13
helloWorld.print();
14
}
15
16
//
public void say(){
17
//
//
相當于回調
18
//
helloWorld.say();
19
//
}
20
}
D: 一個測試類:
1
package
ttitfly.proxy;
2
3
public
class
TestStaticProxy
{
4
5
public
static
void
main(String[] args)
{
6
HelloWorld helloWorld
=
new
HelloWorldImpl();
7
StaticProxy staticProxy
=
new
StaticProxy(helloWorld);
8
staticProxy.print();
9
10
//
staticProxy.say();
11
}
12
}
可以看出靜態代理類有一個很不爽的缺點:當如果接口加一個方法(把上面所有的代碼的注釋給去掉),所有的實現類和代理類里都需要做個實現。這就增加了代碼的復雜度。動態代理就可以避免這個缺點。
3 。動態代理
動態代理與普通的代理相比較,最大的好處是接口中聲明的所有方法都被轉移到一個集中的方法中處理(invoke),這樣,在接口方法數量比較多的時候,我們可以進行靈活處理,而不需要像靜態代理那樣每一個方法進行中轉。
動態代理類只能代理接口,代理類都需要實現InvocationHandler類,實現invoke方法。該invoke方法就是調用被代理接口的所有方法時需要調用的,該invoke方法返回的值是被代理接口的一個實現類
代理類:
1
package
ttitfly.proxy;
2
3
import
java.lang.reflect.InvocationHandler;
4
import
java.lang.reflect.Method;
5
import
java.lang.reflect.Proxy;
6
//
動態代理類只能代理接口,代理類都需要實現InvocationHandler類,實現invoke方法。該invoke方法就是調用被代理接口的所有方法時需要調用的,該invoke方法返回的值是被代理接口的一個實現類
7
public
class
DynamicProxy
implements
InvocationHandler
{
8
9
private
Object object;
10
//
綁定關系,也就是關聯到哪個接口(與具體的實現類綁定)的哪些方法將被調用時,執行invoke方法。
11
//
Proxy.newProxyInstance的第三個參數是表明這些被攔截的方法執行時需要執行哪個InvocationHandler的invoke方法
12
public
Object bindRelation(Object object)
{
13
this
.object
=
object;
14
return
Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),
this
);
15
}
16
//
攔截關聯的這個實現類的方法被調用時將被執行
17
public
Object invoke(Object proxy, Method method, Object[] args)
throws
Throwable
{
18
System.out.println(
"
Welcome
"
);
19
Object result
=
method.invoke(object, args);
20
return
result;
21
}
22
23
}
測試類:
1
package
ttitfly.proxy;
2
3
public
class
TestDynamicProxy
{
4
public
static
void
main(String[] args)
{
5
HelloWorld helloWorld
=
new
HelloWorldImpl();
6
DynamicProxy dp
=
new
DynamicProxy();
7
//
在這里綁定的是HelloWorld,也就是HelloWorld是被代理接口。所以綁定關系時,需要傳遞一個HelloWorld的實現類的實例化對象。
8
HelloWorld helloWorld1
=
(HelloWorld)dp.bindRelation(helloWorld);
9
helloWorld1.print();
10
helloWorld1.say();
11
12
//
helloWorld2將不被攔截
13
HelloWorld helloWorld2
=
new
HelloWorldImpl();
14
helloWorld2.print();
15
helloWorld2.say();
16
17
}
18
}
在測試類里調用實現類的print和say方法,因為代理類里代理了HelloWorld的所有方法。所以就不需要像靜態代理類那樣一一實現了。
[本來想自己寫個類似的東西,不過發現javaeye的這篇寫的已經很好了.轉載過來學習一下.
javaeye的代碼copy功能真好用!.]
發表于 2009-02-17 18:40
redcoatjk
閱讀(372)
評論(1)
編輯
收藏
評論
#
re: [轉]Java 靜態代理和動態代理
動態代理 沒接觸過.看起來有點puzzle
..多看幾次吧..
redcoatjk
評論于 2009-02-17 22:07
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
CALENDER
<
2009年2月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(3)
給我留言
查看公開留言
查看私人留言
隨筆分類
(22)
balabala(2)
(rss)
Database(9)
(rss)
Hibernate(1)
(rss)
J2se(5)
(rss)
Others_4Data Persistence(2)
(rss)
Spring(1)
(rss)
View_lever(2)
(rss)
隨筆檔案
(76)
2014年3月 (1)
2013年11月 (1)
2013年4月 (1)
2012年9月 (1)
2012年7月 (3)
2012年6月 (1)
2012年2月 (2)
2011年11月 (2)
2011年10月 (1)
2011年8月 (5)
2011年6月 (1)
2011年5月 (3)
2011年2月 (1)
2010年8月 (2)
2010年7月 (2)
2010年6月 (2)
2010年5月 (3)
2010年3月 (3)
2009年11月 (2)
2009年10月 (2)
2009年9月 (1)
2009年7月 (2)
2009年5月 (12)
2009年4月 (2)
2009年3月 (3)
2009年2月 (6)
2008年12月 (8)
2008年11月 (3)
文章分類
(12)
J2se(3)
(rss)
Spring(8)
(rss)
Stu-notes(1)
(rss)
文章檔案
(17)
2013年4月 (2)
2010年8月 (1)
2009年2月 (12)
2008年10月 (2)
搜索
積分與排名
積分 - 250544
排名 - 227
最新評論
1.?re: Hibernate session 獲取方式淺談[未登錄]
總結的到位,很值得學習!
--111
2.?re: [轉]java截取字符串,截串,substring和split,分割字母和數字,正則縫隙
ddd
--lukes
3.?將字符串-uadmin-padmin1208@192.168.0.222:/home/admin/zrl/java/rmi/activation分割成admin,admin1208,192.168.0.222,/home/admin/zrl/java/rmi/activation[未登錄]
請幫忙
--美美
4.?re: [轉]Statement和PreparedStatement批量更新
對我的幫助真是太大了
--請問
5.?re: [轉]JDBC中Statement與PreparedStatement的區別
非常好的總結!頂
--naomi
評論排行榜
1.?Hibernate session 獲取方式淺談(3)
2.?[轉]JDBC中Statement與PreparedStatement的區別(2)
3.?[轉]java截取字符串,截串,substring和split,分割字母和數字,正則縫隙(2)
4.?[轉]程序員職業規劃(2)
5.?[轉]JDK5新特性匯總(與1.4對照)(2)
Powered By:
博客園
模板提供
:
滬江博客
主站蜘蛛池模板:
久久精品国产亚洲一区二区
|
日本久久久免费高清
|
国产自偷亚洲精品页65页
|
AV激情亚洲男人的天堂国语
|
久久WWW免费人成人片
|
亚洲av专区无码观看精品天堂
|
亚洲狠狠综合久久
|
日本高清免费观看
|
亚洲蜜芽在线精品一区
|
91精品国产免费
|
亚洲乱码中文论理电影
|
无码永久免费AV网站
|
亚洲人成未满十八禁网站
|
日本免费福利视频
|
免费一级全黄少妇性色生活片
|
亚洲精品偷拍视频免费观看
|
精精国产www视频在线观看免费
|
亚洲日韩激情无码一区
|
十九岁在线观看免费完整版电影
|
91情国产l精品国产亚洲区
|
免费精品国产自产拍在
|
爱情岛论坛亚洲品质自拍视频网站
|
久久国产精品免费一区二区三区
|
亚洲尤码不卡AV麻豆
|
99精品视频在线观看免费播放
|
亚洲黄网在线观看
|
午夜色a大片在线观看免费
|
免费播放国产性色生活片
|
亚洲一区精品无码
|
中文字幕视频免费
|
亚洲人成色4444在线观看
|
精品国产亚洲男女在线线电影
|
国产精品免费无遮挡无码永久视频
|
无码人妻精品一二三区免费
|
无码色偷偷亚洲国内自拍
|
亚洲av最新在线网址
|
免费福利网站在线观看
|
gogo免费在线观看
|
亚洲剧情在线观看
|
区三区激情福利综合中文字幕在线一区亚洲视频1
|
亚洲人成网站色在线入口
|