模拟Java动态代理模式:CGLIB动态代理

代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。

Java开发中的开闭原则,对扩展开放,对修改关闭,所以当功能不满足需求时,应当避免直接修改源代码,而是应该对其进行扩展

cglib动态代理的目标类可以是接口的实现类也可以是普通类

cglib动态代理增强的原则是:子类增强父类,所以cglib动态代理的目标类不能是final修饰的类


cglib对接口实现类的代理


创建接口 TargetInte
模拟Java动态代理模式:CGLIB动态代理
创建目标类 TargetInteImpl
模拟Java动态代理模式:CGLIB动态代理
测试类
模拟Java动态代理模式:CGLIB动态代理
测试结果

模拟Java动态代理模式:CGLIB动态代理

代理的作用就是对目标方法进行功能增强

假设现在目标方法中的功能已经不能满足我们的需求,我们需要在目标方法的原有功能之前增加【输出当前时间】的功能,原有功能之后增加【输出执行结果】的功能,为了符合Java开发的开闭原则,我们不在目标实现类中直接对代码进行修改,而是为目标类创建一个代理类

创建 MethodInterceptor 类 MethodInterceptorProxy

该类实现了 MethodInterceptor 接口和接口中的 intercept 方法,intercept方法是对目标方法功能的增强,包括了目标方法的功能和扩展的功能

在该类中还定义了创建代理的方法
模拟Java动态代理模式:CGLIB动态代理
测试类

调用 MethodInterceptor 类中的方法创建代理
模拟Java动态代理模式:CGLIB动态代理

代理调用方法时实际上是执行 MethodInterceptor 类中的 intercept 方法,也就相当于调用功能增强的目标方法

测试结果
模拟Java动态代理模式:CGLIB动态代理

cglib对普通类的代理


创建目标类(普通类) Target

模拟Java动态代理模式:CGLIB动态代理

创建 MethodInterceptor 类 MethodInterceptorProxy
模拟Java动态代理模式:CGLIB动态代理

测试类
模拟Java动态代理模式:CGLIB动态代理

测试结果
模拟Java动态代理模式:CGLIB动态代理

上一篇:CentOS 7 源码编译安装 Mysql 5.7


下一篇:动态代理最全详解系列[5]-Cglib动态代理源码分析