JDK
jdk动态代理是通过‘java.lang.reflect.Proxy’类和‘InvocationHandler’接口创建动态代理对象。JDK动态代理只能代理接口,而不支持直接代理类。
CGLIB
通过生成目标类的子类来创建代理对象,因此它可以代理类而不仅仅是接口。这使得CGLIB在一些场景下更灵活,但也增加了一些复杂性。
JDK动态代理和CGLIB代理有什么区别?
1. 代理对象类型:
- JDK动态代理: JDK动态代理是基于接口的代理。它要求目标类(被代理的类)必须实现一个或多个接口,然后生成代理对象,代理对象实现了这些接口。
- CGLIB代理: CGLIB代理生成的代理对象是目标类的子类,它通常在创建对象时需要更多的时间和资源。但对于没有实现接口的类,CGLIB代理是唯一的选择。
2. 织入方式:
- JDK动态代理: JDK动态代理是通过Java反射机制来实现的。它可以代理接口方法,但不能代理接口的final方法
- CGLIB代理: CGLIB 代理通过继承目标类来覆盖和代理其中的方法,因此它可以代理类中的final方法。
3. 可见性:
- JDK动态代理: JDK动态代理只能代理实现接口的公共方法,不会代理非公共方法。
- CGLIB代理: CGLIB 可以代理类中的所有方法,包括非公共方法。
4. 创建代理对象的方式:
- JDK动态代理: JDK动态代理需要通过‘java.lang.reflect.Proxy’类创建代理对象,该类用于生成代理对象的实例。
- CGLIB代理: CGLIB代理使用字节码生成库,通过生成目标类的子类来创建代理对象。
5.性能:
- JDK 动态代理: JDK 动态代理的性能通常比 CGLIB 代理略好,尤其是在代理类的创建和方法调用的速度方面。然而,它只能代理实现接口的类。
- CGLIB 代理: CGLIB 代理的性能可能略逊于 JDK 动态代理,因为它需要生成子类并重写方法。但它可以代理没有实现接口的类。