文章目录
动态代理
概念:代理类在程序运行时创建的代理方式被称为动态代理。
作用:在不改变源码的情况下,对已有的方法进行运行时增强。
分类:
- 基于接口的动态代理。
- 基于子类的动态代理。
基于接口的动态代理:
要求:被代理类至少实现一个接口。
涉及的类:Proxy
创建对象的方法:newProxyInstance
方法的参数:
- 类加载器:ClassLoader,加载代理对象字节码,和被代理对象用一个类加载器
- 字节码数组:Class[] 代理对象和被代理对象要具有相同的行为,实现相同接口
- 如果被代理对象是一个实现类:对象.getClass().getinterfaces()
- 如果被代理对象是一个接口:new Class[]{interface}
- 增强方法的接口:InvocationHandler,如何增强,如何代理。
实现InvocationHandler接口,需要重写的方法,实现逻辑
public Object invoke(Object proxy, Method method, Object[] args)
//proxy:代理对象的引用
//method:当前执行的方法
//args::执行当前方法所需的参数
基于子类的动态代理:
要求:被代理类不能是最终类。
涉及类:Enhancer
创建对象的方法:create
方法的参数:
- Class:加载代理对象字节码,使用的是被代理对象的字节码。
- Callback:增强方法的接口,和InvocationHandler一样。callBack是顶层接口,我们需要new MethodInterceptor。
new MethodInterceptor需要实现的方法
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
//proxy:代理类对象引用
//method:当前执行的方法
//args:执行当前方法需要的参数
//methodProxy:执行当前方法的代理类对象