昨天分享了静态代理的概念及存在的缺点,所以今天讲的动态代理模式十分重要。动态代理在我们工作当中应用相当广泛,如Srping AOP就是动态代理的在开源框架的比较出名的应用。

动态代理有两种试,一是通过JDK自带的API实现动态代理,二是通过别的字节码框架实现,如cglib。

需要注意的是JDK只能针对接口实现动态代理,不能代理普通类,使用具有局限性。而cglib可以代理接口及所有的普通类。

下面拿昨天保存用户信息的例子继续用动态代理来实现。

用户接口

public interface UserInterface {boolean saveUser(User user);}

用户接口实现

public class UserInterfaceImpl implements UserInterface {@Overridepublic boolean saveUser(User user) {System.out.println("保存用户: " + user.getName());return true;}
}
public class Test {public static void main(String[] args) {// JDK动态代理testJDKProxy();// Cglib接口代理testCglibInterfaceProxy();// Cglib类代理testCglibClassProxy();}private static void testJDKProxy() {User user = new User();user.setName("tom");UserProxy.getUserProxy().saveUser(user);}static class UserProxy {private static final InvocationHandler USER_HANDLE = new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("JDK接口动态代理-开始保存用户");Object result = method.invoke(new UserInterfaceImpl(), args);System.out.println("JDK接口动态代理-保存用户结果: " + result);System.out.println();return result;}};public static UserInterface getUserProxy() {UserInterface userInterface = (UserInterface) Proxy.newProxyInstance(UserProxy.class.getClassLoader(),new Class[] { UserInterface.class }, USER_HANDLE);return userInterface;}}private static void testCglibInterfaceProxy() {User user = new User();user.setName("tom");UserCglibProxy.getUserProxy().saveUser(user);}static class UserCglibProxy {private static final net.sf.cglib.proxy.InvocationHandler USER_HANDLE = new net.sf.cglib.proxy.InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Cglib接口动态代理-开始保存用户");Object result = method.invoke(new UserInterfaceImpl(), args);System.out.println("Cglib接口动态代理-保存用户结果: " + result);System.out.println();return result;}};public static UserInterface getUserProxy() {UserInterface userInterface = (UserInterface) net.sf.cglib.proxy.Proxy.newProxyInstance(UserCglibProxy.class.getClassLoader(), new Class[] { UserInterface.class }, USER_HANDLE);return userInterface;}}private static void testCglibClassProxy() {User user = new User();user.setName("tom");UserInterfaceImpl userImpl = (UserInterfaceImpl) ClassCgLibProxy.getUserProxy(new UserInterfaceImpl());userImpl.saveUser(user);}static class ClassCgLibProxy {private static final MethodInterceptor USER_HANDLE = new MethodInterceptor() {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Cglib类动态代理-开始保存用户");Object result = proxy.invokeSuper(obj, args);System.out.println("Cglib类动态代理-保存用户结果: " + result);System.out.println();return result;}};public static Object getUserProxy(Object target) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(target.getClass());enhancer.setCallback(USER_HANDLE);return enhancer.create();}}}

结果输出:

JDK接口动态代理-开始保存用户
保存用户: tom
JDK接口动态代理-保存用户结果: trueCglib接口动态代理-开始保存用户
保存用户: tom
Cglib接口动态代理-保存用户结果: trueCglib类动态代理-开始保存用户
保存用户: tom
Cglib类动态代理-保存用户结果: true

从例子看出,使用也并不复杂,动态代理与静态代理最主要的区别在于,静态代理是编译期间就确定好的代理关系,而动态代理是运行期间由JVM通过反射等技术生成的代理对象,不存在class文件,代理类与被代理类之间的关系是继承关系,所以,普通类final的方法是不能被动态代理的。

设计模式之动态代理模式实战相关推荐

  1. 设计模式之静态代理模式实战

    转载自 设计模式之静态代理模式实战 静态代理模式很简单,代理类和实现类都实现相同的接口,然后通过代理类来调用实现类的方法. 如我们想保存用户信息之前打印用户信息,或者保存用户信息之后把这些信息缓存下来 ...

  2. 设计模式之动态代理模式

    一.代理模式分为静态代理和动态代理 代理模式分为静态代理模式和静态代理模式,相对于静态代理模式,动态代理模式理解起来更加抽象. 二.想要了解动态代理模式首先要了解动态代理类 Java动态代理类位于Ja ...

  3. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  4. 设计模式之代理模式、动态代理模式、Cglib代理模式

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的 ...

  5. 【设计模式】--- 装饰器模式、静态代理模式和动态代理模式

    文章目录 1 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...

  6. 设计模式之----Java动态代理模式

    在Spring中,有很多设计模式被应用,其中不乏代理模式.而代码模式中,就一定少不了动态代理模式.今天就对动态代理模式进行学习记录. 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托 ...

  7. 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...

  8. Java设计模式之JDK动态代理模式

    先来谈谈什么动态代理模式,在一家软件公司,假如你是一个软件开发工程师.当客户带着需求去找公司的时候,显然不会直接让你和客户谈,肯定是先和商务经理,产品经理类的谈需求.因为客户的需求可能千奇百怪,很有可 ...

  9. 软件设计模式 | 动态代理模式

    文章目录 一.动态代理概述 1.1 代理的概述和作用 1.2 动态代理的优点 1.3 代理对象的创建 1.4 代理对象调用方法的执行流程 二.动态代理举例 2.1 歌手经纪人 2.2 业务功能的性能统 ...

最新文章

  1. 栈空间不够会报错吗_网站更换域名和空间会对优化有影响吗?
  2. filter的原理(转)
  3. .netcore2.0 发布CentOS7
  4. 专访 | PP云技术副总监:如何使用机器学习算法优化分发链路
  5. mysql正在运行安全文件怎么办_MySQL服务器运行的安全文件化选项,所以它不能执行该语句什么情? 爱问知识人...
  6. 使用手机企业微信创建自己的企业(公司)
  7. 携程启动“2021混合办公试验”,梁建章:拥抱疫情之外的在家办公
  8. nginx 405 not allowed问题解决方法
  9. 「08」回归的诱惑:深入浅出逻辑回归(Python实战篇)
  10. 大数据Hadoop学习记录(3)----基于JAVA语言的HDFS文件过滤与合并
  11. win10使用debug
  12. php json转数组不成功,phpjson转数组出错
  13. WinDbg分析蓝屏dump原因
  14. js控制表格实时编辑
  15. 杜鹏的个人博客 Flex使用Blazeds与Java交互及自定义对象转换详解
  16. 模拟城市服务器连接中断 正试着,【模拟城市5】确认DRM在线 中断不会被踢
  17. 计算机无法使用本地搜索,电脑资源管理器搜索功能无法使用解决措施
  18. 《疯狂Java讲义》第5章 面向对象(上)——课后练习
  19. “大脑营养剂”给你好睡眠
  20. KVM虚机转换为VMware虚机

热门文章

  1. 为Docker Swarm添加调度策略
  2. RadioGroup结合RadioButton使用切换Fragment片段
  3. Python学习札记(二) python3.5安装 + (假装是)第一个Python程序
  4. NFS Volume Provider(Part I) - 每天5分钟玩转 OpenStack(62
  5. 【技术总结】几种常用的无线串行通信技术
  6. 如何获取Oracle数据库中某表及索引、约束、触发器、对象权限的创
  7. linux select 多路复用机制
  8. Ubuntu 16.04下Caffe-SSD的应用(七)——制作自己的VOC2007数据集
  9. c与c++中struct区别
  10. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题