JDK动态代理和CGLib动态代理实现原理和两者的区别
面试题例子\AOP的例子\spring
1、JDK动态代理
- JDK动态代理是基于Java反射机制实现的。
- 在使用JDK动态代理时,被代理的对象必须实现一个或多个接口,代理对象的类型由接口类型决定。
- 在运行时,JDK动态代理会动态地创建一个实现指定接口的代理类,并且重写该接口的所有方法,使得这些方法的调用都被转发到InvocationHandler对象中的invoke方法中进行处理。
JDK 动态代理就是靠 Java 反射,被代理的得实现接口,运行时会新创一个代理类,把接口方法重写,方法调用都转到 InvocationHandler 的 invoke 方法去处理。
2、CGLib动态代理
- CGLib动态代理则是通过继承被代理类来实现的。
- 在使用CGLib动态代理时,被代理的类不必实现任何接口,代理对象的类型由被代理类的类型决定。
- 在运行时,CGLib动态代理会动态地创建一个被代理类的子类,并且重写该类的所有非final方法
CGLIB 通过继承被代理类实现,被代理类无需接口,运行时动态创建子类,重写非 final 方法来实现代理功能。
3、两者的区别在于:
JDK动态代理只能代理实现了接口的类,而CGLib动态代理可以代理任何类。
JDK动态代理在运行时会动态生成代理类;而CGLib动态代理在运行时会动态生成被代理类的子类。
JDK 动态代理只能代理有接口的类,运行时生成代理类;CGLib 动态代理能代理任何类,运行时生成被代理类的子类。
4、总结
总的来说,如果被代理的类实现了接口,建议使用JDK动态代理;如果被代理的类没有实现接口,建议使用CGLib动态代理。