浅析java代理模式

浅析java代理模式摘要:本文棊于JAVA语言对静态和动态代理做出了分析,并且进行了实现,对以后理解JAVA的JDK和Cglib包提供的代理服务打下基础。关键词:设计模式;静态代理;动态代理中图分类号:TP393.02代理模式是一个非常重要的设计模式,不但我们自己在设计程序的时候经常用到,很多著名的框架如Spring.Hibernate等都用到了代理模式,因此理解并且学会灵活使用代理模式就非常必要。代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问。简单地说,代理类具有和被代理类一样的方法,调用者通过调用代理类的方法间接调用了被代理类相同名字的方法,对于调用者来说,它不用察觉自己调用的是代理类的方法,感觉上仍然在调用被代理类的方法。对于被代理类来说,代理类可以在调用其方法前后做其他工作,比如写FI志等。按照代理的创建时期,代理类可以分为两种:静态代理类:在程序运行前,由程序员创建再编译成.class文件;动态代理类:在程序运行时,运用反射机制动态创建而成。1静态代理静态代理类:由程序员创建或由特定工具自动牛成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。静态代理原理就是聚合+多态。1.1静态代理静态代理模式有三个角色:抽象接口、代理类、被代理类。其它类通过访问代理类来访问被代理类。1.2静态代理的实现(1)建一个抽象接口publicinterfaceSubject.{publicvoidprint(Stringwords);}(2)建一个被代理类,需耍实现抽象接口publicclassRealSubjectimplementsSubject{publicvoidprint(Stringwords){System,out.printin(〃被代理人郭襄说:〃+words);}}(3)建一个代理类,需要实现抽象接口publicclassProxySubjectimplementsSubject{privateSubjects;publicProxySubject(Subjects){this・s=s;}publicvoidprint(Stringwords){System,out.printin(〃我是代理,我名字叫黄蓉!“);s.print(words);System,out.printin(〃黄蓉代理完毕!“);}}(4)建一个客户端程序测试,关键代码如下:Subjectsubl二newRealSubject();Subjectsub2=newProxySubject(subl);sub2.print(〃你好!“);运行输出:我是代理,我的名字叫黄蓉!;被代理的人郭襄说:你好!;黄蓉代理完毕。从输出可以看出,在真实对象的print方法被调用前后,代理对象都做了其他操作。对于客户端来说,它只对接口Subject编程,提高了代码的可维护和可升级性。2动态代理动态代理类:就是具代理类是在程序运行时,运用反射机制动态创建而成,并不需要像静态代理那样子事先要编写好代理类。如果有多重代理,就要写多个代理类,还有如果一个类有多个方法都需要代理的话,就更加使得代码很臃肿,不易维护,这个时候就需要动态地来生成代理类,这就是动态代理。2.1动态代理动态代理模式至少要有6个角色:(1)抽象接口;(2)被代理类;(3)处理器接口;(4)自定义的处理器(实现处理器接口);(5)生成成代理类的类;(6)代理类(由第5点的类通过反射技术自动生成)。2.2动态代理的实现(1)首先建一个抽象接口publicinterfaceSubject{publicvoidprint();}(2)建一个被代理类,需要实现Subject接口publicclassRealSubjectimplementsSubject{publicvoidprint(){System,out.printin("被代理人郭襄“);}}(3)建一个处理接口publicinterfaceInvocationllandler{publicObjectinvoke(Objectproxy,Methodmethod)throwsException;}(4)建一个用户口定义的处理器,需要实现处理接口在invoke()方法里写上被代理类的方法调用前后要进行的动作。这个invoke()方法我们不用直接调用,是让将来自动生成的代理类去调用的。invoke()方法关键代码如下:System,out.println(〃我是代理人郭靖,开始代理〃);method・invoke(delegate);System,out.printin("我是代理人郭靖,代理完毕“);(5)建生成代理类的类,主要是运用java的反射技术和jdk的编译工具生成代理类对象并加载到内存里面,代码比较复杂,这里不再详细描述。(6)编写测试客户端,关键代码如下Subjectsubl=newRealSubject();LogHandlerhander=newLogIland1er();Subjectsub2=(Subject)hander.bind(subl);sub2.print()...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

文秘专家
机构认证
内容提供者

1

确认删除?