代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

代理模式一般涉及到的角色有:

  抽象角色:声明真实对象和代理对象的共同接口;

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

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

一个简单的例子如下:

package com.java.proxy;interface Subject{abstract public void request();
}class RealSubject implements Subject{@Overridepublic void request() {System.out.println("real subject");}
}class ProxySubject implements Subject{Subject subject;public ProxySubject() {}public ProxySubject(Subject subject){this.subject=subject;}@Overridepublic void request() {System.out.println("预处理工作");subject.request();System.out.println("后续工作");}
}
public class ProxyModel {public static void main(String[] args) {Subject subject=new ProxySubject(new RealSubject());subject.request();}
}

  由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理 RealSubject类,同样达到目的,同时还可以封装其他方法(可以做一些预处理,和后续工作),可以处理一些其他问题。

  另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须 对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。

 动态代理

  Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:

    (1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。 这个抽象方法在代理类中动态实现。

    (2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容: 
      Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。

      Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。

      Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。

  所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作

  下面我们使用动态代理来改写上面的例子:

package com.java.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;interface Subject{abstract public void request();
}class RealSubject implements Subject{public RealSubject() {}@Overridepublic void request() {System.out.println("real subject");}
}class ProxySubject implements InvocationHandler{private Subject obj;public ProxySubject() {}public ProxySubject(Subject obj){this.obj=obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("预处理工作");method.invoke(obj, args);System.out.println("后续工作");return null;}
}
public class ProxyModel {public static void main(String[] args) {RealSubject realSubject=new RealSubject();Class<?>cla=realSubject.getClass();InvocationHandler handler=new ProxySubject(realSubject);Subject subject=(Subject)Proxy.newProxyInstance(cla.getClassLoader(), cla.getInterfaces(), handler);subject.request();}
}

  

最后我们给出一个在远程方法中使用代理的例子:因为代码很长,所以不打算在文章中粘贴代码了,我把项目上传到微盘了,下载地址为:http://vdisk.weibo.com/s/jax8z

项目的部署为:

java代理模式与反射机制相关推荐

  1. java代理模式_Java代理

    java代理模式 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指导您 ...

  2. java代理模式(java代理模式和适配器模式)

    Java设计模式的中介者模式是怎样的? 如果对象之间的关系原本一目了然,中介对象的加入便是"画蛇添足". 来看下中介者模式的组成部分吧. 1) 抽象中介者(Mediator)角色: ...

  3. java代理模式总结

    Java代理模式根据代理类生成时间的不同,可以分为静态代理和动态代理,它如同中介机构,可以为目标类提供代理服务,以控制对对象的访问,目标类的任何方法在执行前都必须经过代理类,这样代理类就可以用来负责请 ...

  4. java代理模式-原来你是这样的代理

    这几天在看一些框架源码时看到了一个很奇妙的设计模式,有种熟悉个感觉,一时想不出是什么模式,后面经过了解才知道是动态代理,就这样带着好奇心学习了这个模式,更深入了解代理会发现不仅有静态和动态,还有很多其 ...

  5. 阿里十年资深程序员吐血总结之Java代理模式

    阿里十年资深程序员吐血总结之Java代理模式 文章目录 阿里十年资深程序员吐血总结之Java代理模式 1.接口代理 2.类代理 3.动态代理都是通过反射实现的吗 4.jdk动态代理和cglib动态代理 ...

  6. Java代理模式汇编

    文章目录 Java 代理模式实现方式,主流如下五种方法 Notes 静态代理实现 实现步骤 Cat接口 委托类 Lion 代理类角色(FeederProxy) 静态代理类测试 动态代理类(基于接口实现 ...

  7. [Java] 代理模式 Proxy Mode

    [Java] 代理模式 Proxy Mode 文章目录 [Java] 代理模式 Proxy Mode 1. 代理思想 2.java.lang.reflect.Proxy类 2.1 利用反射创建prox ...

  8. java代理模式实现

    java代理模式实现 @(代理模式)[静态代理,动态代理,InvocationHandler] java的代理模式 分为两种,静态代理和动态代理,学习下什么是代理和静态动态代理的作用. java代理模 ...

  9. 浅谈自己对Java代理模式的理解--即为什么要用怎么用

    首先,国际惯例,上Java代理模式的定义:  Java代理模式:对其他对象提供一种代理以控制对这个对象的访问.              定义很简单,就一句话,怎么去理解,不急,先听一个小故事: 故事 ...

  10. java 反射 工厂模式_Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)-反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

最新文章

  1. 服务器硬盘如何增加分区,服务器硬盘分区方法是什么?
  2. “GANs之父”Ian Goodfellow被爆已从Google离职
  3. Csharp关键字----delegate(委托)
  4. List接口的三大实现类比较
  5. python怎么按键开始与停止_python 图形化开始与停止功能的实现
  6. 有奖问题征集|向大咖Scott 发问,好礼等你领!
  7. html table渐变色,Safari浏览器中的渐变问题(给tr添加的渐变效果作用在了td上)...
  8. 我们看到一些知乎大V,开始拍视频了
  9. 微软软件推送服务器,微软将通过系统更新功能向大部分用户推送新版Microsoft Edge浏览器-...
  10. Dart 语言不如 Kotlin?这里列了 13 个原因
  11. 2020年CSDN技术人内推活动 千里马专区职位列表
  12. 【论文笔记】韩家炜团队AutoPhrase:自动短语挖掘
  13. 广西南宁机器人比赛_第18届广西青少年机器人竞赛闭幕
  14. 数据治理系列1:数据治理框架【解读分析】
  15. python 定时器、每天凌晨3点执行方法_python 定时器,实现每天凌晨3点执行的方法...
  16. 【论文精读】 使用空间梯度和噪声分割标签(伪标签)的深度学习配准
  17. 雷军:小米创业背后的一些故事和体会
  18. 简述Python数据类型
  19. java中反射机制的含义_java的反射是什么意思?
  20. ngnix 配置多个前端项目(首次上传vue)

热门文章

  1. java编程 数组的中位数中枢_Java算法题1:找出两个有序数组的中位数?
  2. c语言考试答案,C语言考试题及答案
  3. hook代码 svn_Svn结合hook实现自动更新及多Project管理更新
  4. 斐波那契查找算法(黄金分割查找算法)
  5. 高淇Struts2.0教程之视频笔记(4)
  6. 如何去除PDF的水印
  7. 最小生成树模板 加 例题分析 (最小生成树类型汇总)
  8. 作业2-Python基础练习
  9. web渗透测试中WAF绕过讲解(二)基于HTTP协议绕过
  10. 會議管理系統--項目總結