Rising Sun
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
148 随笔 :: 0 文章 :: 22 评论 :: 0 Trackbacks
<
2013年2月
>
日
一
二
三
四
五
六
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
8
9
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(10)
给我留言
查看公开留言
查看私人留言
随笔分类
cpp(3)
(rss)
css(6)
(rss)
hibernate+struts+spring(3)
(rss)
javascript(9)
(rss)
Lucene(3)
(rss)
oracle 数据库(6)
(rss)
云计算(4)
(rss)
其它(6)
(rss)
处理Excel poi(6)
(rss)
学习总结(15)
(rss)
环境设置(2)
(rss)
随笔档案
2015年1月 (3)
2014年12月 (1)
2014年9月 (1)
2014年6月 (2)
2014年4月 (2)
2014年1月 (2)
2013年12月 (3)
2013年11月 (1)
2013年10月 (2)
2013年8月 (2)
2013年7月 (3)
2013年5月 (3)
2013年3月 (9)
2013年2月 (8)
2013年1月 (4)
2012年10月 (1)
2012年9月 (2)
2012年8月 (1)
2012年7月 (3)
2012年5月 (1)
2012年1月 (1)
2011年3月 (1)
2010年12月 (1)
2009年12月 (1)
2009年10月 (1)
2009年8月 (4)
2009年7月 (3)
2009年6月 (2)
2009年5月 (2)
2009年4月 (3)
2008年11月 (3)
2008年10月 (2)
2008年9月 (1)
2008年8月 (2)
2008年7月 (3)
2008年5月 (1)
2007年11月 (1)
2007年10月 (2)
2007年9月 (2)
2007年8月 (3)
2007年7月 (6)
2007年6月 (3)
2007年4月 (2)
2006年12月 (2)
2006年11月 (1)
2006年10月 (2)
2006年9月 (3)
2006年8月 (3)
2006年7月 (26)
2005年11月 (4)
相册
我的相册
java--->ajax
BlueDavy
http://www.blogjava.net/BlueDavy/
css
css
eamoi
搜索
最新评论
1. re: request.getParameterValues与request.getParameter的区别:
5+5+
--5465
2. re: 关于filter验证用户权限
333
--12
3. re: Gson通过借助TypeToken获取泛型参数的类型的方法
博主如果解决了楼上的问题 请联系我 万分感谢 联系方式QQ 474233979
--yueguangxuanyuan
4. re: Gson通过借助TypeToken获取泛型参数的类型的方法
评论内容较长,点击标题查看
--yueguangxuanyuan
5. re: CMS,全称Concurrent Low Pause Collector gc[未登录]
很有用。非常感谢!!!!
--匿名
阅读排行榜
1. Gson通过借助TypeToken获取泛型参数的类型的方法(42668)
2. 304 Not Modified状态码(18896)
3. 电脑非法关机 导致ORA-01033:解决方法(9080)
4. struts2 -- interceptor(如何配置Interceptor) (7511)
5. MYSQL在默认的情况下查询是不区分大小写的(7340)
评论排行榜
1. Gson通过借助TypeToken获取泛型参数的类型的方法(6)
2. Busy Developers' Guide to HSSF Features (说明书)(3)
3. 对于网上看到Window.Open()传值(3)
4. excel 处理 Poi(1)
5. 关于filter验证用户权限(1)
Java 静态代理和动态代理
1. 代理模式主要有两种:静态代理和动态代理
2. 静态代理:
比如要在输出“HelloWorld”前打印一个字符串“Welcome”
A:先定义一个接口类
Java代码
package
ttitfly.proxy;
public
interface
HelloWorld {
public
void
print();
// public void say();
}
B: 定义一个该接口的实现类
java 代码
Java代码
package
ttitfly.proxy;
public
class
HelloWorldImpl
implements
HelloWorld{
public
void
print(){
System.out.println("HelloWorld");
}
// public void say(){
// System.out.println("Say Hello!");
// }
}
C:定义一个静态代理类
Java代码
package
ttitfly.proxy;
public
class
StaticProxy
implements
HelloWorld{
public
HelloWorld helloWorld ;
public
StaticProxy(HelloWorld helloWorld){
this
.helloWorld = helloWorld;
}
public
void
print(){
System.out.println("Welcome");
//相当于回调
helloWorld.print();
}
// public void say(){
// //相当于回调
// helloWorld.say();
// }
}
D: 一个测试类:
Java代码
package
ttitfly.proxy;
public
class
TestStaticProxy {
public
static
void
main(String[] args){
HelloWorld helloWorld =
new
HelloWorldImpl();
StaticProxy staticProxy =
new
StaticProxy(helloWorld);
staticProxy.print();
// staticProxy.say();
}
}
可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。这就增加了代码的复杂度。动态代理就可以避免这个缺点。
3 。动态代理
动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
代理类:
Java代码
package
ttitfly.proxy;
import
java.lang.reflect.InvocationHandler;
import
java.lang.reflect.Method;
import
java.lang.reflect.Proxy;
//动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
public
class
DynamicProxy
implements
InvocationHandler{
private
Object object;
//绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
//Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法
public
Object bindRelation(Object object){
this
.object = object;
return
Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),
this
);
}
//拦截关联的这个实现类的方法被调用时将被执行
public
Object invoke(Object proxy, Method method, Object[] args)
throws
Throwable {
System.out.println("Welcome");
Object result = method.invoke(object, args);
return
result;
}
}
测试类:
Java代码
package
ttitfly.proxy;
public
class
TestDynamicProxy {
public
static
void
main(String[] args){
HelloWorld helloWorld =
new
HelloWorldImpl();
DynamicProxy dp =
new
DynamicProxy();
//在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。
HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);
helloWorld1.print();
helloWorld1.say();
//helloWorld2将不被拦截
HelloWorld helloWorld2 =
new
HelloWorldImpl();
helloWorld2.print();
helloWorld2.say();
}
}
在测试类里调用实现类的print和say方法,因为代理类里代理了HelloWorld的所有方法。所以就不需要像静态代理类那样一一实现了。
posted on 2013-02-21 12:01
brock
阅读(222)
评论(0)
编辑
收藏
所属分类:
学习总结
Powered by:
BlogJava
Copyright © brock