本论文是一篇计算机有关论文网,关于java代理模式相关毕业论文的格式范文。免费优秀的关于计算机及助理工程师及参考文献方面论文范文资料,适合计算机论文写作的大学硕士及本科毕业论文开题报告范文和学术职称论文参考文献下载。
摘 要:本文基于JAVA语言对静态和动态代理做出了分析,并且进行了实现,对以后理解JAVA的JDK和Cglib包提供的代理服务打下基础.
关 键 词:设计模式;静态代理;动态代理
中图分类号:TP393.02
代理模式是一个非常重要的设计模式,不但我们自己在设计程序的时候经常用到,很多著名的框架如Spring、Hibernate等都用到了代理模式,因此理解并且学会灵活使用代理模式就非常必要.
代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问.简单地说,代理类具有和被代理类一样的方法,调用者通过调用代理类的方法间接调用了被代理类相同名字的方法,对于调用者来说,它不用察觉自己调用的是代理类的方法,感觉上仍然在调用被代理类的方法.对于被代理类来说,代理类可以在调用其方法前后做其他工作,比如写日志等.按照代理的创建时期,代理类可以分为两种:静态代理类:在程序运行前,由程序员创建再编译成.class文件;动态代理类:在程序运行时,运用反射机制动态创建而成.
1静态代理
静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了.静态代理原理就是聚合+多态.
1.1静态代理
静态代理模式有三个角色:抽象接口、代理类、被代理类.其它类通过访问代理类来访问被代理类.
有关论文范文主题研究: | 关于计算机的论文范文 | 大学生适用: | 自考论文、研究生毕业论文 |
---|---|---|---|
相关参考文献下载数量: | 74 | 写作解决问题: | 写作技巧 |
毕业论文开题报告: | 论文模板、论文结论 | 职称论文适用: | 杂志投稿、职称评初级 |
所属大学生专业类别: | 写作技巧 | 论文题目推荐度: | 优质选题 |
1.2静态代理的实现
(1)建一个抽象接口
publicinterfaceSubject{
publicvoidprint(Stringwords);
}
(2)建一个被代理类,需要实现抽象接口
publicclassRealSubjectimplementsSubject{
publicvoidprint(Stringwords){
System.out.println("被代理人郭襄说:"+words);
}
}
(3)建一个代理类,需要实现抽象接口
publicclassProxySubjectimplementsSubject{
privateSubjects;
publicProxySubject(Subjects){
this.s等于s;
}
publicvoidprint(Stringwords){
System.out.println("我是代理,我名字叫黄蓉!");
s.print(words);
System.out.println("黄蓉代理完毕!");
}
}
(4)建一个客户端程序测试,关键代码如下:
Subjectsub1等于newRealSubject();
Subjectsub2等于newProxySubject(sub1);
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.println("被代理人郭襄");
}
}
(3)建一个处理接口
publicinterfaceInvocationHandler{
publicObjectinvoke(Objectproxy,Methodmethod)throwsException;
}
(4)建一个用户自定义的处理器,需要实现处理接口
在invoke()方法里写上被代理类的方法调用前后要进行的动作.这个invoke()方法我们不用直接调用,是让将来自动生成的代理类去调用的.invoke()方法关键代码如下:
System.out.println("我是代理人郭靖,开始代理");
method.invoke(delegate);
System.out.println("我是代理人郭靖,代理完毕");(5)建生成代理类的类,主要是运用java的反射技术和jdk的编译工具生成代理类对象并加载到内存里面,代码比较复杂,这里不再详细描述.
(6)编写测试客户端,关键代码如下
Subjectsub1等于newRealSubject();
LogHandlerhander等于newLogHandler();
Subjectsub2等于(Subject)hander.bind(sub1);
这篇论文转载于:http://www.sxsky.net/benkelunwen/06032054.html
sub2.print();
输出结果:我是代理人郭靖;开始代理;被代理的人郭襄;我是代理人郭靖,代理完毕.从结果可以看出,代理成功,并且自动生成了代理类$Proxy.java文件,并成功实现了代理的效果.
2.3动态代理的优势
动态代理的明显好处上面就体现出来了:对于同一个对象的所有方法,如果对所有方法都是相同的处理逻辑,只需要写一次处理逻辑就行;对于同一个抽象接口,不同的对象,如果对所有对象的相同名字的方法具有相同的处理逻辑(同一个对象,不同方法的处理逻辑可以不同),也只需要写一次处理逻辑就行,只需要写一次处理器类即可;如果某一天,那个方法的处理逻辑被改变了,只需要改动一次即可,如果是静态代理,每个代理类下的相对应的方法的处理逻辑都要改动一次,维护非常困难.
3结束语
代理模式可以运用在如下这些方面:(1)用于在程序调用前后记录相关日志及其他附加操作;(2)用于某些操作前的安全及权限的验证等保护操作;(3)用于创建对象,也叫虚代理,对于某些大对象,在真正需要它的时候,运用代理模式去创建;(4)使得同一对象被多个客户同时访问不产生冲突.
我们可以灵活使用代理模式,配合其他模式的使用,如工厂模式,使我