当前位置: 首页 > 图灵资讯 > java面试题> JDK动态代理与CGLIB实现的区别

JDK动态代理与CGLIB实现的区别

来源:图灵教育
时间:2024-02-18 09:38:24
 

JDK动态代理和CGLIB是Java中常用的两种代理技术,它们在实现原理和使用方式上有一些区别。

  • JDK动态代理是基于接口的代理技术,要求目标类必须实现一个或多个接口。它使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来生成代理类和处理代理方法的调用。在运行时,JDK动态代理会动态生成一个代理类,该代理类实现了目标接口,并在方法调用前后插入额外的代码(即代理逻辑)。然而,JDK动态代理只能代理接口,无法代理普通的类。
  • CGLIB是基于继承的代理技术,可以代理普通的类,不需要目标类实现接口。它使用字节码生成库,在运行时通过生成目标类的子类来实现代理。CGLIB通过继承目标类创建一个子类,并重写目标方法,以在方法调用前后插入额外的代码(即代理逻辑)。但是,由于继承关系,CGLIB无法代理被标记为final的方法。

总的来说,JDK动态代理适用于基于接口的代理需求,而CGLIB适用于代理普通类的需求。选择使用哪种代理方式取决于具体的需求。如果目标类已经实现了接口且需要基于接口进行代理,可以选择JDK动态代理。而如果目标类没有实现接口,或者需要代理普通类的方法,可以选择CGLIB