博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代理模式之动态代理
阅读量:5293 次
发布时间:2019-06-14

本文共 886 字,大约阅读时间需要 2 分钟。

  代理模式顾名思义就是,找一个代理人帮你做事。比如B是买房者,要买房必须要经过中介A代理买房,因为B没有联系房东的方式。这里有三个角色,一个是代理对象即A,一个是目标对象B,第三个是A和B的抽象接口对象C。

动态代理:可以使用类的动态加载机制(基于反射),在代码运行期间加载被代理的类。比如Spring 的AOP机制。

JDK的动态代理

 Java的反射类库中有相关的API,可以通过API构建代理对象。即InvocationHandler接口和Proxy类。下面上代码。

 

 

 

 

 运行结果:

 

 

通过结果可以看到,动态代理和静态代理一样实现了对目标功能的增强。

动态代理实现步骤:

1 写一个实现InvocationHandler接口的代理对象Handler,实现类里重写的invoke方法。在invoke里可以在目标类方法前后增加代码进行验证/写入日志等,实现了AOP的思想。

2.创建目标对象

3.创建代理对象Handler

4.利用Proxy的newProxyInstance方法创建代理对象,参数分别填目标对象的classloader,目标对象的接口集合,代理对象Handler。

 

 

总结下

动态代理的好处:

1.一个动态代理代理多个接口,接口增加方法,不需要修改代理类。动态代理类不会因为业务的逐渐庞大而庞大;

2.在程序运行到时通过反射创建,才知道要代理哪个类,具有更强的灵活性。

缺点:

1.只能对接口代理,对类的代理需要第三方的CLIGB类库

2.反射创建导致性能相对于静态代理稍低

 

其他

1.Spring的AOP就是基于JDK代理和CLIGB类库代理两种动态代理实现的,实现在业务逻辑前后统一进行 日志/权限/事务 等等的操作。

2.如果需要代理的方法单一,比如多种的接口方法都需要加日志。这个时候动态代理比较好;如果多种的接口每种需要加不同的操作,这个时候还不如使用静态代理。

3.CLIGB类库代理不在此详细展开。原理实际上是动态生成被代理类的子类字节码

转载于:https://www.cnblogs.com/liumz0323/p/10328584.html

你可能感兴趣的文章
在现有的mysql主从基础上,搭建mycat实现数据的读写分离
查看>>
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>
tensorflow的graph和session
查看>>
6-1 并行程序模拟 uva210
查看>>
JavaScript动画打开半透明提示层
查看>>
Mybatis生成resulteMap时的注意事项
查看>>
jquery-jqzoom 插件 用例
查看>>
1007. Maximum Subsequence Sum (25)
查看>>
《算法》C++代码 快速排序
查看>>
iframe的父子层跨域 用了百度的postMessage()方法
查看>>
Js apply方法与call方法详解 附ES6新写法
查看>>
linux php全能环境一键安装,小白福利!
查看>>
图片生成缩略图
查看>>
关于Mysql select语句中拼接字符串的记录
查看>>
动态规划 例子与复杂度
查看>>
[BZOJ4567][SCOI2016]背单词(Trie+贪心)
查看>>
查看oracle数据库的连接数以及用户
查看>>
【数据结构】栈结构操作示例
查看>>
中建项目环境迁移说明
查看>>
三.野指针和free
查看>>