从开始java学习到从事java工作这么多时间以来,对代理模式的概念和现实已经了解的比较清楚了,但是一直不知道它的应用场景到底是什么样的,网上的资料无非就是对方法的增强或者增加日志操作什么的,我想这些操作我做个包装类,在这个类中做这些处理不是一样吗?

先说说概念:静态代理、动态代理、cglib

静态代理:实例和代理类都实现了同一个接口,不管传递什么实例进代理类中都能调用方法,不需要在每个新生成的实例中重复写某一个方法

Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:
(1)  Interface InvocationHandler:该接口中仅定义了一个方法
public objectinvoke(Object obj, Methond method, Object[] args)在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。
(2)  Proxy:该类即为动态代理类
static ObjectnewProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类在接口中声明过的方法)

3   cglib也是动态代理,不同于proxy,它不需要基于接口进行代理

代理模式的优点:

1、代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;

2、代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了保护目标对象的作用

3、还有一个我认为的优点、使用代理类我们就可以不用管委托类方法中的变动,或者我们只需要做少量的调整,比如如果委托类中的某个方法突然改成私有了,那个不使用代理类我们需要在每个此方法调用的地方都要把反射处理才能调用,使用代理之后 我们只需要在代理类中处理就可以了,当然这些操作可以使用包装类做,但是问题就在于我们不知道哪个方法会变成私有,不可能每个方法都写个包装类进行反射处理。

缺点:

1、由于在客户端和真实对象之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢;

2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

3、静态代理在委托类变多的情况时会显的非常臃肿,不方便阅读与使用

最近研究了一下应用场景,说说我的理解吧,如果不对请大家指出。

1:类中的方法批量处理

2:方法的区分处理

3:当我们想要隐藏某个类,或者这个类中的部分方法

4:扩展功能

1 ===> 假如一个类中的方法有100个,我们想要对这些方法都做日志处理。这个时候我们就可以使用代理,简化代码,不需要在每个方法调用的时候都做日志处理。

2====> 基于委托类中的这100个方法,其中有50个方法我想做日志处理,另外40个方法我想做执行时间输出,另10个我不想做处理的时候用代理也是挻好的

3====> 如果某个类我想隐藏,但是每些方法又想给其它人使用就可以使用代理。这些隐藏又如私有化构造,或者内部类等。

4====> 扩展功能也是常说的功能,对方法进行增强等操作,对不同的权限进行不同的增强......

下面介绍一下cglib中的实现,参考https://www.cnblogs.com/xrq730/p/6661692.html

public class DaoFilter implements CallbackFilter {@Overridepublic int accept(Method method) {if ("select".equals(method.getName())) {return 0;                 //这里返回的数字对应的是callback中的代理位置}return 1;}}
@Testpublic void testCglib() {DaoProxy daoProxy = new DaoProxy();DaoAnotherProxy daoAnotherProxy = new DaoAnotherProxy();   //两个不同的代理Enhancer enhancer = new Enhancer();enhancer.setSuperclass(Dao.class);enhancer.setCallbacks(new Callback[]{daoProxy, daoAnotherProxy, NoOp.INSTANCE});//代理中的位置0,1,2enhancer.setCallbackFilter(new DaoFilter());Dao dao = (Dao)enhancer.create();dao.update();  //update对应filter中的1,所以会使用daoAnotherProxy代理dao.select();  //select对应filter中的0,所以会使用daoProxy代理//如果有个方法不想做处理就可以让filter返回2,这个就是使用NoOp.INSTANCE不做处理}

通常构造方法中对委托类的调用也会走代理,cglib中可以设置对构造方法中方法调用不使用代理

@Testpublic void testCglib() {DaoProxy daoProxy = new DaoProxy();DaoAnotherProxy daoAnotherProxy = new DaoAnotherProxy();Enhancer enhancer = new Enhancer();enhancer.setSuperclass(Dao.class);enhancer.setCallbacks(new Callback[]{daoProxy, daoAnotherProxy, NoOp.INSTANCE});enhancer.setCallbackFilter(new DaoFilter());enhancer.setInterceptDuringConstruction(false); //===>此处默认是true,设置false后,构造方法中方法的调用不走代理Dao dao = (Dao)enhancer.create();dao.update();dao.select();}    

此外还可以使用泛型,对不同的委托进行代理

public class CglibTest<T> {public  T aaa(T t) {return t;}public void testCglib(T o,Class c) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {DaoProxy daoProxy = new DaoProxy();Enhancer enhancer = new Enhancer();enhancer.setSuperclass(c);
//        enhancer.setCallbacks(new Callback[]{daoProxy,NoOp.INSTANCE});enhancer.setCallback(daoProxy);@SuppressWarnings("unchecked")T dao = (T)enhancer.create();Method[] methods = c.getDeclaredMethods();for (Method method : methods) {System.out.println(method.getName());method.invoke(dao);}}public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {Dao dao = new Dao();CglibTest<Dao> c = new CglibTest<>();c.testCglib(dao, dao.getClass());}
}

java代理模式的应用场景相关推荐

  1. [Java] 代理模式 Proxy Mode

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

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

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

  3. Java代理模式汇编

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

  4. Java代理模式:如何优雅地控制对象访问?

    文章目录 一.引言 1.1 简介 二.什么是代理模式 2.2 概述 2.3 使用场景 2.4 优缺点 三.静态代理模式 3.1 定义 3.2 实现方式 3.3 示例代码 3.4 优缺点 四.动态代理模 ...

  5. java代理模式_Java代理

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

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

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

  7. java代理模式总结

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

  8. java代理模式实现

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

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

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

  10. 说说 JAVA 代理模式

    原文出处: 姜肇海 投稿 事例 小张是一个普普通通的码农,每天勤勤恳恳地码代码.某天中午小张刚要去吃饭,一个电话打到了他的手机上."是XX公司的小张吗?我是YY公司的王AA".&q ...

最新文章

  1. linux的根文件系统中的proc文件夹详解
  2. mysql sum函数返回类型_MySQL的sum函数返回的门类
  3. xib文件的读取方法
  4. Spring : Importxxx系列注解
  5. Cere Network 将于 Republic、DAO Maker 和 Polkastarter 上进行公售
  6. Redis基础学习(2)
  7. elementos php开发,PHPWord
  8. 学习 灰色2017.12.08
  9. php中is upload,PHP中,文件上传
  10. 一步之遥 c语言答案是多少,蓝桥杯之一步之遥-Go语言中文社区
  11. flask使用pymysql连接MySQL,生成xls文件并下载到本地
  12. 行业专家揭秘家装五大主材底价
  13. Vue 使用Echarts
  14. Simulink仿真---clark变换、反clark变换
  15. vs2010开发activex(MFC)控件/ie插件(二)
  16. 支付宝直付通怎么签约教程详解,支付宝直付通开通需要什么条件!
  17. 5个强大的Java分布式缓存框架_5个Java分布式缓存框架
  18. html超链接几种写法
  19. Ubuntu中使用RoboMongo实现MongoDB的可视化
  20. 国际移动设备识别码IMEI

热门文章

  1. 数字信号处理教程第五版答案
  2. 我们梳理了国内外逾80家公司,发现6大关键趋势 | 36氪眼健康行业报告
  3. 斐讯路由器K2最新刷机教程
  4. Android 手机修改 WiFi MAC 地址
  5. 小程序 实现语音播放功能
  6. <PCI-E> PCI-E的 x1/x4/x8/x16 四种插槽区别
  7. linux ftps ftp,linux ftps ftp-over-ssl 配置实验
  8. java基础学习1-java实验输出希腊字母表
  9. Kvaser、C++、Qt编写监控界面(一)
  10. python如何设计系统界面教程_python图形化界面设计tkinter!python用户界面设计教程...