Cglib
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`
动态代理技术 - CGLIB
动态代理是一种常用的设计模式,它能够在运行时创建一个实现了一组给定接口的新类。这种技术在很多场景下都非常有用,比如在编写测试代码或者构建某些类型的框架时。
CGLIB(Code Generation Library)是一个功能强大的,高性能,高质量的Code生成类库。它可以在运行时扩展Java类与实现Java接口。它广泛用于许多AOP框架中,如Spring AOP和dynaop,为那些没有实现接口的类提供方法拦截。
CGLIB的主要特点
使用字节码增强技术,动态生成被代理对象的子类。
对于final方法和类,无法进行继承。
相比于Java标准的动态代理,CGLIB可以为没有实现接口的类创建代理。
为什么选择CGLIB?
当我们需要代理的对象没有实现任何接口时,就没有办法使用Java自带的动态代理机制,因为它需要至少一个接口。这时CGLIB是一个很好的选择。由于其使用了底层的字节码技术,相较于Java自带的代理,CGLIB在性能上通常会有更优的表现。
CGLIB的工作原理
CGLIB通过继承的方式,生成原始类的子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并顺势织入横切逻辑。
如何使用CGLIB?
以下是一个简单的使用CGLIB实现动态代理的例子:
在这个例子中,enhancer.setSuperclass(MyClass.class);
告诉CGLIB,我们想要为MyClass
创建一个子类。然后,我们定义了一个MethodInterceptor
,它会在所有方法调用之前和之后执行额外的动作。最后,我们通过enhancer.create();
方法创建了这个子类的实例。
总结
CGLIB是一个强大的库,能够在不改变原有代码的情况下,为Java类添加新的行为。正因为其强大的功能以及对不实现接口的类的支持,它成为了Spring等框架的底层支持技术。不过,使用这种技术要注意它的性能影响,并且要理解它是如何工作的,以避免不必要的问题。
最后更新于