动态代理:
概念:
依赖被代理对象B的字节码信息,创建代理对象A,用户对B的任意方法访问必须经过A的处理。该方法实现了用户与B类的隔离,在不修改源码的基础上(无侵入式的代码扩展),对被代理对象的方法进行增强。
简单点说就是,你作为大臣递给皇上的奏章,都被慈禧(代理对象)先看一遍并批改一下,才能给真正的皇上看(被代理对象)。
实现方法分类:
-
基于接口的动态代理
依赖类:Proxy(JDK官方)
使用条件:被代理对象B至少实现一个接口,否则不能使用
使用方法:使用Proxy类中的newProxyInstance方法,根据B类字节码创建代理类A;
newProxyInstance方法的参数:
- ClassLoader:用于加载被代理对象字节码中的类加载器,固定写法,xx.getClass().getClassLoader();
- Class[]:字节码数组,用于让代理对象和被代理对象有相同的方法,固定写法,xx.getClass().getInterfaces();
- InvocationHandler:用于提供增强的代码,匿名内部类InvocationHandler,覆写invoke()(这个函数就是下图中的红色菱形);
便于理解的示意图:
-
基于子类的动态代理
依赖类:Enhancer(cglib第三方库)
使用条件:被代理对象B不能是final
使用方法:使用Enhancer类中的create方法,根据B类字节码创建代理类A
create方法的参数:
-
Class:被代理类B的字节码,固定写法,xx.getClass();
-
Callback:用于提供增强的代码,使用匿名类MethodInterceptor,覆写intercept()方法
原理图同上。