一、文章要点提前知
二、动态代理的本质
1、首先了解一下动态代理类对应的class文件是什么时候生成的?
首先通过一张图了解一下Java源文件实例对象的一个简单的流程:
2、动态代理的本质
简述:通过一定的技术,省略源文件的编写,直接在运行期间,生成相应的Java字节码文件;
三、JDK原生动态代理
1、JDK原生动态代理中两个重要的小伙伴
a、Proxy:Proxy是所有动态代理的父类;它提供了一个静态的方法创建代理的Class对象来配置生成代理类Class文件的方法与参数,主要就是通过Proxy.newProxyInstance(类加载器,类实现的接口,InvocationHandler实现类),返回Object类型,通过接口类型强转换即可使用代理类;
b、InvacationHandler:每个动态代理实例都有一个关联的InvocationHandler;被代理类的代理方法被调用时,方法将被转发到InvocationalHandler的invoke方法执行。
c、小结:Proxy就是用来生成代理类的,InvocationalHandler使用来对被代理方法进行扩展的
2、原理图下:
3、实战演练
a、实体类
b、被代理类实现接口
c、被代理类
d、JDK动态代理实现类
e、测试类
f、测试结果
4、总结:两个个要素
a、被代理类必须实现一个接口
b、InvocationalHandler只是用来做业务增强的,并不能真正的实现业务,也就是内部还是需要调用被代理类的业务方法去实现业务,不能对业务内部进行修改
四、CGLB动态代理
CGLB全称是Code Generation Library,是一个基于ASM的字节码生成库,允许我们在运行时对字节码文件进行修改和动态生成。
1、CGLB的两个小伙伴
a、Enchancer:来指定要代理的目标对象;实际处理逻辑的对象;最终通过create()方法得到代理对象,对这个对象的非final()方法的调用都会转发给代理对象;
b、MethodInterceptor:动态代理的方法调用都会转发到intercept()上进行增强;
2、原理图
3、实战演练
a、添加依赖
b、被代理类
c、CGLB动态代理实现类
d、测试类
e、测试结果
4、总结:
a、CGLB动态代理实现方式降低了被代理对象的要求
b、CGLB动态代理对于被代理对象的final方法无法进行增强
五、两种动态代理的优缺点对照表