讲讲 JDK 动态代理?
基于接口代理,主要是实现了InvocationHandler 接口去处理逻辑,主要是实现invoke方法,然后通过Proxy.newProxyInstance()方法创建一个代理对象
Proxy.newProxyInstance()传入ClassLoader 类加载器
interfaces : 被代理类实现的一些接口;
实现了 InvocationHandler 接口的对象;
讲讲 CGLIB 动态代理?
CGLIB 动态代理基于类代理,是一个基于ASM的字节码生成库,将被代理类的 class 文件加载进来,通过修改其字节码生成一个子类来处理。
在 CGLIB 动态代理机制中 MethodInterceptor 接口和 Enhancer 类是核心。
主要通过实现MethodInterceptor 接口,然后重写 intercept 方法,然后通过Enhancer类创建一个代理对象
新生成的代理对象的 Class 对象会继承 superClass 被代理的类,在重写的方法中会调用 callback 回调接口(方法拦截器)进行处理。
JDK 动态代理和 CGLIB 动态代理有什么不同?
两者都是在 JVM 运行时期新创建一个 Class 对象,实例化一个代理对象,对目标类(或接口)进行代理。JDK 动态代理只能基于接口进行代理,生成的代理类实现了这些接口;而 CGLIB 动态代理则是基于类进行代理的,生成的代理类继承目标类,但是不能代理被 final 修饰的类,也不能重写 final 或者 private 修饰的方法。
CGLIB 动态代理比 JDK 动态代理复杂许多,性能也相对比较差。