如果是代理设计模式,那么JDK的动态代理和第三方动态代码生成API(例如CGLib)有什么区别?
使用这两种方法之间的区别是什么?何时应该优先选择另一种方法?
JDK动态代理只能按接口进行代理(因此,您的目标类需要实现一个接口,然后该接口也可以由代理类实现)。
CGLIB(和javassist)可以通过子类化创建代理。在这种情况下,代理将成为目标类的子类。无需接口。
因此,Java Dynamic代理可以代理:public class Foo implements iFooCGLIB可以代理:public class Foo
public class Foo implements iFoo
public class Foo
编辑:
我应该提到的是,由于javassist和CGLIB通过子类化使用代理,因此这就是您在使用依赖于此的框架时无法声明final方法或将类定为final的原因。这将阻止这些库允许子类化您的类并覆盖您的方法。