1、JDK动态代理
- JDK动态代理是基于Java反射机制实现的。
- 在使⽤JDK动态代理时,被代理的对象必须实现⼀个或多个接⼝,代理对象的类型由接⼝类型决定。
- 在运⾏时,JDK动态代理会动态地创建⼀个实现指定接⼝的代理类,并且重写该接⼝的所有⽅法,使得这些⽅法的调⽤都被转发到InvocationHandler对象中的invoke⽅法中进⾏处理。
2、CGLib动态代理
- CGLib动态代理则是通过继承被代理类来实现的。
- 在使⽤CGLib动态代理时,被代理的类不必实现任何接⼝,代理对象的类型由被代理类的类型
决定。
3. 在运⾏时,CGLib动态代理会动态地创建⼀个被代理类的⼦类,并且重写该类的所有⾮final⽅法
3、两者的区别在于:
JDK动态代理只能代理实现了接⼝的类,⽽CGLib动态代理可以代理任何类。
JDK动态代理在运⾏时会动态⽣成代理类;⽽CGLib动态代理在运⾏时会动态⽣成被代理类的⼦类。
4、总结
总的来说,如果被代理的类实现了接⼝,建议使⽤JDK动态代理;如果被代理的类没有实现接⼝,建议使⽤CGLib动态代理。