Java反射学习总结三(静态代理)
反射最常见的应用就是代理模式了。
本文先简单介绍一下代理模式,并写一个静态代理的例子。为下一篇重要的动态代理做点铺垫
代理模式的作用是:
为其他对象提供一种代理以控制对这个对象的访问。
另外在某些情况下,一个客户不想或着不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
说白了,代理模式就是一个"中介",他有这客户们的引用,所以可以用这个"中介"来代替客户来做操作。
代理模式设计的角色:
想使用代理模式,需要定义如下的3个角色:
抽象角色:
声明真实对象和代理对象的共同接口
真实对象:
代理角色所代表的真实对象,是我们最终要引用的对象
代理角色:
1.代理对象内部含有对真实对象的引用,从而可以操作真实的对象。
2.代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。
3.代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
可能看完概念后有点迷糊,接下来直接上代码看例子应该会比较容易理解:
1.首先定义抽象角色对象,使用抽象类或者接口来定义一个代理角色和真实对象共有的一个方法。这个方法就是被代理角色委托给"中介"来操作的方法
- //这里定义一个抽象类
- public abstract class Subject {
- //空的抽象方法,这个方法需要代理角色和真实角色都去实现它
- public abstract void request();
- }
2.定义真实角色对象
- //真实角色对象,继承自抽象角色,重写定义的方法。
- public class RealSubject extends Subject{
- //在重写的方法中实现需要的操作,这里只是简单打印一句
- @Override
- public void request() {
- System.out.println("this is real subject");
- }
- }
3.定义代理角色对象
- //代理角色,同样继承抽象角色,重写抽象角色中的方法
- public class ProxySubject extends Subject{
- //在代理角色内部对真实角色的引用
- private RealSubject realSubject;
- //重写的实现抽象角色中的方法
- @Override
- public void request() {
- this.preRequest(); //在调用真实角色操作之前所附加的操作
- if (realSubject == null) {
- realSubject = new RealSubject();
- }
- realSubject.request(); //真实角色所完成的事情
- this.postRequest(); //在真实角色操作之后所附加的操作
- }
- //自定义的方法,在真实方法执行之前调用的方法
- private void preRequest() {
- System.out.println("pre request");
- }
- //自定义的方法,在真实方法执行之后调用的方法
- private void postRequest() {
- System.out.println("post request");
- }
- }
在实现代理角色对象时,最重要的一点是要有一个真实对象的引用。
通过这个引用在代理对象中去调用真实对象的方法,并且可以自定义一些其他的操作,比如本例子中的preRequest()和postRequest(),他们分别在之前和之后被调用。
这样做可以记录一下运行时间或打log之类的操作,但这里仅仅是打印了一句话。
4.最后看看main方法中如何调用:
- public class TestProxy {
- public static void main(String[] args) {
- //实例化一个代理角色对象
- Subject subject = new ProxySubject();
- //用代理对象去调用定义的通用方法
- subject.request();
- }
- }
输出为:
pre request
this is real subject
post request
大家看代码后可以发现,这里并没有用到反射的知识。而且对于上面的例子来说,真实角色对象是事先必须已经存在的,并且必须是作为代理对象的内部属性。
如果这样的话,有一个真实角色那就必须在代理角色中有一个他的引用,如果在不知道真实角色的情况下又需要怎么办?这就需要"动态代理"来解决了。
下一篇文章就来介绍"动态代理"。
Java反射学习总结三(静态代理)的更多相关文章
- Java反射学习总结四(动态代理使用实例和内部原理解析)
通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...
- Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- Java多线程学习(三)volatile关键字
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
- Java反射学习系列-绪论
Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924
- Java 反射理解(三)-- Java获取方法信息
Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void ...
- Java IO学习笔记三:MMAP与RandomAccessFile
作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...
- JAVA反射学习网摘
程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动 ...
- Java 反射学习笔记
要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...
随机推荐
- Impala储存与分区
不多说,直接上干货! hive的元数据存储在/user/hadoop/warehouse Impala的内部表也在/user/hadoop/warehouse. 那两者怎么区分,看前面的第一列. 下面 ...
- sql server 内置MD5加密函数
http://blog.csdn.net/rookie_liu_ToFly/article/details/53116932 select right(sys.fn_VarBinToHexStr(HA ...
- 将字符串使用md5加密
>>> import md5 >>> md5.md5('123').hexdigest() '202cb962ac59075b964b07152d234b70' & ...
- js12---闭包,原型,继承
<html> <body> <script type="text/javascript"> //闭包实现了函数层面多个子函数共享父类函数的属性. ...
- js03 数组
变量的自动转换=== 等同符:不会发生类型的自动转化! == 等值符:会发生类型自动转化.自动匹配!判断相等没有equals()方法,只有2个等号3个等号. <!DOCTYPE HTML PUB ...
- 轻松学习Linux之本地安装系统
1.安装Linux前的准备工作(详细讲解了系统分区,及类型) 2.轻松学习Linux之用光驱安装 3.轻松学习Linux之用光驱安装(之二) 4.硬盘安装Linux系统 本文出自 "李晨光原 ...
- BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...
- CF1009F Dominant Indices(树上DSU/长链剖分)
题目大意: 就是给你一棵以1为根的树,询问每一个节点的子树内节点数最多的深度(相对于这个子树根而言)若有多解,输出最小的. 解题思路: 这道题用树链剖分,两种思路: 1.树上DSU 首先想一下最暴力的 ...
- 51NOD——T 1079 中国剩余定理
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1079 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难 ...
- COGS——T 1265. [NOIP2012] 同余方程
http://cogs.pro/cogs/problem/problem.php?pid=1265 ★☆ 输入文件:mod.in 输出文件:mod.out 简单对比时间限制:1 s 内 ...