反射最常见的应用就是代理模式了。

本文先简单介绍一下代理模式,并写一个静态代理的例子。为下一篇重要的动态代理做点铺垫

代理模式的作用是

为其他对象提供一种代理以控制对这个对象的访问。
另外在某些情况下,一个客户不想或着不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
说白了,代理模式就是一个"中介",他有这客户们的引用,所以可以用这个"中介"来代替客户来做操作。

代理模式设计的角色
想使用代理模式,需要定义如下的3个角色:

抽象角色

声明真实对象和代理对象的共同接口

真实对象

代理角色所代表的真实对象,是我们最终要引用的对象

代理角色

1.代理对象内部含有对真实对象的引用,从而可以操作真实的对象。
2.代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。
3.代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装

可能看完概念后有点迷糊,接下来直接上代码看例子应该会比较容易理解:

1.首先定义抽象角色对象,使用抽象类或者接口来定义一个代理角色和真实对象共有的一个方法。这个方法就是被代理角色委托给"中介"来操作的方法

  1. //这里定义一个抽象类
  2. public abstract class Subject {
  3. //空的抽象方法,这个方法需要代理角色和真实角色都去实现它
  4. public abstract void request();
  5. }

2.定义真实角色对象

  1. //真实角色对象,继承自抽象角色,重写定义的方法。
  2. public class RealSubject extends Subject{
  3. //在重写的方法中实现需要的操作,这里只是简单打印一句
  4. @Override
  5. public void request() {
  6. System.out.println("this is real subject");
  7. }
  8. }

3.定义代理角色对象

  1. //代理角色,同样继承抽象角色,重写抽象角色中的方法
  2. public class ProxySubject extends Subject{
  3. //在代理角色内部对真实角色的引用
  4. private RealSubject realSubject;
  5. //重写的实现抽象角色中的方法
  6. @Override
  7. public void request() {
  8. this.preRequest();  //在调用真实角色操作之前所附加的操作
  9. if (realSubject == null) {
  10. realSubject = new RealSubject();
  11. }
  12. realSubject.request();  //真实角色所完成的事情
  13. this.postRequest();  //在真实角色操作之后所附加的操作
  14. }
  15. //自定义的方法,在真实方法执行之前调用的方法
  16. private void preRequest() {
  17. System.out.println("pre request");
  18. }
  19. //自定义的方法,在真实方法执行之后调用的方法
  20. private void postRequest() {
  21. System.out.println("post request");
  22. }
  23. }

在实现代理角色对象时,最重要的一点是要有一个真实对象的引用。

通过这个引用在代理对象中去调用真实对象的方法,并且可以自定义一些其他的操作,比如本例子中的preRequest()和postRequest(),他们分别在之前和之后被调用。

这样做可以记录一下运行时间或打log之类的操作,但这里仅仅是打印了一句话。

4.最后看看main方法中如何调用:

  1. public class TestProxy {
  2. public static void main(String[] args) {
  3. //实例化一个代理角色对象
  4. Subject subject = new ProxySubject();
  5. //用代理对象去调用定义的通用方法
  6. subject.request();
  7. }
  8. }

输出为:

pre request

this is real subject

post request

大家看代码后可以发现,这里并没有用到反射的知识。而且对于上面的例子来说,真实角色对象是事先必须已经存在的,并且必须是作为代理对象的内部属性。

如果这样的话,有一个真实角色那就必须在代理角色中有一个他的引用,如果在不知道真实角色的情况下又需要怎么办?这就需要"动态代理"来解决了。

下一篇文章就来介绍"动态代理"。

Java反射学习总结三(静态代理)的更多相关文章

  1. Java反射学习总结四(动态代理使用实例和内部原理解析)

    通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...

  2. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...

  3. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  4. Java多线程学习(三)volatile关键字

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  5. Java反射学习系列-绪论

    Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924

  6. Java 反射理解(三)-- Java获取方法信息

    Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void ...

  7. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

  8. JAVA反射学习网摘

    程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动 ...

  9. Java 反射学习笔记

    要学反射,先要了解Class这个类,Class是所有Java类的一个总称,Class的实例中存储的是一个类的字节码,获取Class的实例有三种方式: System.class new Date().g ...

随机推荐

  1. 洛谷P3383 【模板】线性筛素数(Miller_Rabin)

    题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行 ...

  2. 使用Java语言开发微信公众平台(五)——被关注回复与关键词回复

      在上一篇文章中,我们实现了文本消息的接收与响应.可以在用户发送任何内容的时候,回复一段固定的文字.本章节中,我们将对上一章节的代码进行适当的完善,同时实现[被关注回复与关键词回复]功能. 一.微信 ...

  3. LuoguP2764 最小路径覆盖问题(最大流)

    题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...

  4. CMDB学习之三数据采集

    判断系统因为是公用的方法,所有要写基类方法使用,首先在插件中创建一个基类 将插件文件继承基类 思路是创建基类使用handler.cmd ,命令去获取系统信息,然后进行判断,然后去执行 磁盘 ,cpu, ...

  5. opencv标定程序(改动)

    转载请注明来自:http://blog.csdn.net/zhouyelihua/article/details/38421377 资源下载见:点击打开链接 百度云盘免积分下载:https://pan ...

  6. EasyUI——DataGrid中嵌入Radio

    前一篇博客写到项目中的广告位管理,当时没有写到今天的问题,这个问题当时也是困扰我好久. 经过自己的努力和同志们的帮助,最后最终解决. 实现要求把全部的广告位后面的单选button设成一组,目的是一个广 ...

  7. QTemporaryDir及QTemporaryFile建立临时目录及文件夹(创建一个随机名称的目录或文件,两者均能保证不会覆盖已有文件)

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址:本文标题:QTemporaryDir及QTemporaryFile建立临时目录及文件夹     本文地址: ...

  8. 如果笔记本的 WIN7 运行很卡,请尝试运行这些批处理

    如果笔记本的 WIN7 运行很卡,请尝试运行这些批处理 WIN7是不是很卡?关掉下列服务吧 @echo off rem AppXSvc 为部署应用商店应用程序提供基础结构支持 rem BITS 微软的 ...

  9. [NOI.AC#40]Erlang

    链接 题解 显然,最多抽2个集合 如果一直抽一个,前提是该集合有重复的,答案是不同元素的个数+1 如果抽两个,那么最坏情况下,在一个集合中抽到某一个数的次数是这个集合不同元素的个数(因为抽不到重复的) ...

  10. startActivityForResult()的用法

    举例说我想要做的一个事情是,在一个主界面(主Activity)上能连接往许多不同子功能模块(子Activity上去),当子模块的事情做完之后就回到主界面,或许还同时返回一些子模块完成的数据交给主Act ...