一尘不染

JDK动态代理和CGLib有什么区别?

java

如果是代理设计模式,那么JDK的动态代理和第三方动态代码生成API(例如CGLib)有什么区别

使用这两种方法之间的区别是什么?何时应该优先选择另一种方法?


阅读 243

收藏
2020-09-09

共1个答案

一尘不染

JDK动态代理只能按接口进行代理(因此,您的目标类需要实现一个接口,然后该接口也可以由代理类实现)。

CGLIB(和javassist)可以通过子类化创建代理。在这种情况下,代理将成为目标类的子类。无需接口。

因此,Java Dynamic代理可以代理:public class Foo implements iFooCGLIB可以代理:public class Foo

编辑:

我应该提到的是,由于javassist和CGLIB通过子类化使用代理,因此这就是您在使用依赖于此的框架时无法声明final方法或将类定为final的原因。这将阻止这些库允许子类化您的类并覆盖您的方法。

2020-09-09