Cglib
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 实现动态代理的例子:
1 | Enhancer enhancer = new Enhancer(); |
在这个例子中,enhancer.setSuperclass(MyClass.class);
告诉 CGLIB,我们想要为 MyClass
创建一个子类。然后,我们定义了一个 MethodInterceptor
,它会在所有方法调用之前和之后执行额外的动作。最后,我们通过 enhancer.create();
方法创建了这个子类的实例。
总结
CGLIB 是一个强大的库,能够在不改变原有代码的情况下,为 Java 类添加新的行为。正因为其强大的功能以及对不实现接口的类的支持,它成为了 Spring 等框架的底层支持技术。不过,使用这种技术要注意它的性能影响,并且要理解它是如何工作的,以避免不必要的问题。