代理模式之动态代理

  代理模式顾名思义就是,找一个代理人帮你做事。比如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类库代理不在此详细展开。原理实际上是动态生成被代理类的子类字节码

posted @ 2019-01-28 00:58  匿了匿了  阅读(729)  评论(0编辑  收藏  举报