隨筆:93 文章:11 評論:22 引用:0
My Rhythm
萬物皆對象 萬事歸節(jié)奏
首頁
發(fā)新隨筆
發(fā)新文章
聯系
聚合
管理
[轉]Java 靜態(tài)代理和動態(tài)代理
載自http://kuangbaoxu.javaeye.com/blog/192804
1. 代理模式主要有兩種:靜態(tài)代理和動態(tài)代理
2. 靜態(tài)代理:
比如要在輸出“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:定義一個靜態(tài)代理類
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
}
可以看出靜態(tài)代理類有一個很不爽的缺點:當如果接口加一個方法(把上面所有的代碼的注釋給去掉),所有的實現類和代理類里都需要做個實現。這就增加了代碼的復雜度。動態(tài)代理就可以避免這個缺點。
3 。動態(tài)代理
動態(tài)代理與普通的代理相比較,最大的好處是接口中聲明的所有方法都被轉移到一個集中的方法中處理(invoke),這樣,在接口方法數量比較多的時候,我們可以進行靈活處理,而不需要像靜態(tài)代理那樣每一個方法進行中轉。
動態(tài)代理類只能代理接口,代理類都需要實現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
//
動態(tài)代理類只能代理接口,代理類都需要實現InvocationHandler類,實現invoke方法。該invoke方法就是調用被代理接口的所有方法時需要調用的,該invoke方法返回的值是被代理接口的一個實現類
7
public
class
DynamicProxy
implements
InvocationHandler
{
8
9
private
Object object;
10
//
綁定關系,也就是關聯到哪個接口(與具體的實現類綁定)的哪些方法將被調用時,執(zhí)行invoke方法。
11
//
Proxy.newProxyInstance的第三個參數是表明這些被攔截的方法執(zhí)行時需要執(zhí)行哪個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
//
攔截關聯的這個實現類的方法被調用時將被執(zhí)行
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的所有方法。所以就不需要像靜態(tài)代理類那樣一一實現了。
[本來想自己寫個類似的東西,不過發(fā)現javaeye的這篇寫的已經很好了.轉載過來學習一下.
javaeye的代碼copy功能真好用!.]
發(fā)表于 2009-02-17 18:40
redcoatjk
閱讀(373)
評論(1)
編輯
收藏
評論
#
re: [轉]Java 靜態(tài)代理和動態(tài)代理
動態(tài)代理 沒接觸過.看起來有點puzzle
..多看幾次吧..
redcoatjk
評論于 2009-02-17 22:07
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網站導航:
博客園
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)
搜索
積分與排名
積分 - 250625
排名 - 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的區(qū)別
非常好的總結!頂
--naomi
評論排行榜
1.?Hibernate session 獲取方式淺談(3)
2.?[轉]JDBC中Statement與PreparedStatement的區(qū)別(2)
3.?[轉]java截取字符串,截串,substring和split,分割字母和數字,正則縫隙(2)
4.?[轉]程序員職業(yè)規(guī)劃(2)
5.?[轉]JDK5新特性匯總(與1.4對照)(2)
Powered By:
博客園
模板提供
:
滬江博客
主站蜘蛛池模板:
国产成人亚洲精品
|
亚洲国产午夜精品理论片在线播放
|
日韩中文字幕在线免费观看
|
亚洲?V无码乱码国产精品
|
亚洲另类无码专区丝袜
|
成年人在线免费观看
|
亚洲人成无码久久电影网站
|
处破女第一次亚洲18分钟
|
国产成人高清精品免费鸭子
|
亚洲AV无码第一区二区三区
|
亚洲乱码在线观看
|
中文字幕免费观看视频
|
亚洲色中文字幕无码AV
|
丁香花在线视频观看免费
|
亚洲va在线va天堂va四虎
|
麻豆va在线精品免费播放
|
国产成人精品久久亚洲高清不卡
|
免费无毒a网站在线观看
|
久久WWW免费人成一看片
|
亚洲六月丁香婷婷综合
|
日韩免费视频在线观看
|
国产vA免费精品高清在线观看
|
99久久免费国产香蕉麻豆
|
亚洲啪啪AV无码片
|
日韩免费在线观看视频
|
亚洲国产高清美女在线观看
|
成人免费av一区二区三区
|
亚洲AV日韩AV天堂久久
|
很黄很黄的网站免费的
|
亚洲码和欧洲码一码二码三码
|
免费观看国产小粉嫩喷水
|
亚洲另类无码专区首页
|
亚洲一级片免费看
|
最近免费mv在线电影
|
亚洲AV成人精品一区二区三区
|
337p日本欧洲亚洲大胆色噜噜
|
国产综合精品久久亚洲
|
99免费在线观看视频
|
亚洲国产精品国自产拍电影
|
黄色网址免费在线观看
|
亚洲日本国产精华液
|