动态代理的两种实现和优缺点

一、文章要点提前知

img

二、动态代理的本质

1、首先了解一下动态代理类对应的class文件是什么时候生成的?

首先通过一张图了解一下Java源文件实例对象的一个简单的流程:

img

2、动态代理的本质
简述:通过一定的技术,省略源文件的编写,直接在运行期间,生成相应的Java字节码文件;

img

三、JDK原生动态代理

1、JDK原生动态代理中两个重要的小伙伴

​ a、Proxy:Proxy是所有动态代理的父类;它提供了一个静态的方法创建代理的Class对象来配置生成代理类Class文件的方法与参数,主要就是通过Proxy.newProxyInstance(类加载器,类实现的接口,InvocationHandler实现类),返回Object类型,通过接口类型强转换即可使用代理类;

​ b、InvacationHandler:每个动态代理实例都有一个关联的InvocationHandler;被代理类的代理方法被调用时,方法将被转发到InvocationalHandler的invoke方法执行。

​ c、小结:Proxy就是用来生成代理类的,InvocationalHandler使用来对被代理方法进行扩展的

2、原理图下:

img

3、实战演练

​ a、实体类

img

​ b、被代理类实现接口

img

​ c、被代理类

img

​ d、JDK动态代理实现类

img

​ e、测试类

img

​ f、测试结果

img

4、总结:两个个要素
a、被代理类必须实现一个接口

​ b、InvocationalHandler只是用来做业务增强的,并不能真正的实现业务,也就是内部还是需要调用被代理类的业务方法去实现业务,不能对业务内部进行修改

四、CGLB动态代理

CGLB全称是Code Generation Library,是一个基于ASM的字节码生成库,允许我们在运行时对字节码文件进行修改和动态生成。

1、CGLB的两个小伙伴

​ a、Enchancer:来指定要代理的目标对象;实际处理逻辑的对象;最终通过create()方法得到代理对象,对这个对象的非final()方法的调用都会转发给代理对象;
​ b、MethodInterceptor:动态代理的方法调用都会转发到intercept()上进行增强;
2、原理图

img

3、实战演练

​ a、添加依赖

img

​ b、被代理类

img

​ c、CGLB动态代理实现类

img

​ d、测试类

img

​ e、测试结果

img

4、总结:

​ a、CGLB动态代理实现方式降低了被代理对象的要求

​ b、CGLB动态代理对于被代理对象的final方法无法进行增强

五、两种动态代理的优缺点对照表

img

猜你喜欢

转载自blog.csdn.net/qq_44918331/article/details/114641992
今日推荐