Skip to content

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

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

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

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

更新: 2023-09-20 14:47:30
原文: https://www.yuque.com/tulingzhouyu/db22bv/ap2kirq34rguntso

短视频

大家好,我是 JJ,今天给大家分享一道高频面试题 JDK动态代理与CGLIB代理的区别

在Java中,JDK动态代理和CGLIB代理是两种常用的代理技术。不过它们在实现方式和适用场景上都存在了一些差异

JDK动态代理只能代理实现了接口的类,它通过反射机制在运行时生成代理类

代理类会动态地创建一个实现了目标接口的代理对象,并在方法调用前后执行一些额外的操作。

因为依赖接口,所以如果目标类没有实现接口,就无法使用JDK动态代理

CGLIB代理则没有这个限制,它可以代理普通类。

因为它是利用字节码生成库在运行时生成目标类的子类来实现代理。

这个子类会重写目标类的方法,并在方法调用前后执行一些额外的操作。

因为CGLIB代理基于继承,所以目标类没有实现接口,也可以进行代理。

不过需要注意的是,CGLIB代理无法代理被标记为final的方法,因为这些方法不能被重写。

至于选择哪种代理技术取决于具体的需求了。

更新: 2024-06-13 20:52:37
原文: https://www.yuque.com/tulingzhouyu/db22bv/nir8mz8zvf8swg1a