动态代理
# 动态代理
>i JDK原生动态代理是Java原生支持的,不需要任何外部依赖,但是它只能基于接口进行代理(需要代理的对象必须实现于某个接口)
>w CGLIB通过继承的方式进行代理(让需要代理的类成为Enhancer的父类),无论目标对象有没有实现接口都可以代理,但是无法处理final的情况。
## JDK 动态代理
Java的动态代理主要是基于Proxy类和InvocationHandler实现的;
### Proxy
<img src="https://oscimg.oschina.net/oscnet/up-28defc25f1ad1558b319042bcaea523cacf.png" width=400 height=300>
### InvocationHandler
java.lang.reflect.InvocationHandler#invoke
```
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
```
## CGlib动态代理
CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理:
Enhancer:来指定要代理的目标对象,实际处理代理逻辑的对象,最终通过调用create()方法得到代理对象,对这个对象的所有非final方法的调用都会转发给MethodInterceptor;
MethodInterceptor:动态代理对象的方法调用丢回转发到intercept方法进行增强
## 参考资料
原文链接:https://blog.csdn.net/jingyoushui/article/details/104299347