您的位置:首页 > 其它

设计模式--动态代理模式

2015-03-14 01:04 363 查看
介绍:(约定:这里主要以Java语言进行讨论)

动态代理顾名思义是指在运行时,动态的生成代理类(即:代理类的字节码是在运行时生成并载入当前的ClassLoader的)。

相比于静态代理的优势

首先,动态代理不需要为真实主题写一个形式上完全一样的封装类,如果主题接口中的方法很多,为一个方法实现一个代理方法也是很繁琐的一件工作,同时,如果接口有任何改动,则真实主题和代理类都需要进行相应的改动,工作量将大大的增加,不利于系统的维护。其次,动态代理能很大幅度的减少代码的行数,在一定程度上提升系统的灵活性。

动态代理的实现

动态代理类的实现方法有很多,比如:JDK自带的动态代理实现和一些第三方jar包都可以实现,比较著名的第三方jar包有很多,比如CGLIB、 Spring使用的AspectJ。

JDK自带的动态代理实现Demo:

public class JDKSubjectHandler implemntsInvocationHandler{
<span style="white-space:pre">	</span>Subjectreal = null;
<span style="white-space:pre">	</span>@Override
<span style="white-space:pre">	</span>publicObject invoke(Object proxy, Method method, Object[] args) throw Throwable{
<span style="white-space:pre">	</span>if(real== null){
<span style="white-space:pre">	</span>   real= new SubjectReal();
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>return real.methodName();
<span style="white-space:pre">	</span>}
}


JDK 生成动态代理对象,JDK的动态代理需要实现一个处理方法调用的Handler,用于是实现代理方法的背部逻辑。以上代码实现了一个Handler。接下来,我们使用这个Handler生成动态代理对象:

public static SubjectcreateJDKProxy(){
Subject jdkProxy = (Subject)Proxy.newProxyInstance(
ClassLoader.getSystemClassLoader(),
New Class(){Subject.class}, new JDKSubjectHandler());
<span style="white-space:pre">	</span>return jskProxy;
}


以上代码生成了一个实现了Subject接口的代理类,代理类的内部逻辑由JDKSubjectHandler决定。生成代理类后,由newProxyInstance()方法返回该代理类的一个实例。至此,一个完整的JDK动态代理Demo就完成了。

在Java中,动态代理的生成主要涉及对ClassLoader的使用,关于涉及的基本知识和Java底层的一些涉及机制有关,具体可以参见相应的学习笔记(后续会补上关于java虚拟机规范的学习笔记)。

关于动态代理还有很懂经典的实例:比如Spring、Hibernate等框架中是实现,都是经典的案例,后续会将这部分的学习笔记和开发心得慢慢的补上。

(PS:学习和开发的时候喜欢采用笔记本来记录,要转为博文还是比较消耗时间的,也需要耐心的,还望见谅。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: