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 enhancer = new Enhancer();
enhancer.setSuperclass(MyClass.class);
enhancer.setCallback(new MethodInterceptor() {
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("before method run...");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("after method run...");
        return result;
    }
});

MyClass myClass = (MyClass) enhancer.create();

在这个例子中,enhancer.setSuperclass(MyClass.class);告诉CGLIB,我们想要为MyClass创建一个子类。然后,我们定义了一个MethodInterceptor,它会在所有方法调用之前和之后执行额外的动作。最后,我们通过enhancer.create();方法创建了这个子类的实例。

总结

CGLIB是一个强大的库,能够在不改变原有代码的情况下,为Java类添加新的行为。正因为其强大的功能以及对不实现接口的类的支持,它成为了Spring等框架的底层支持技术。不过,使用这种技术要注意它的性能影响,并且要理解它是如何工作的,以避免不必要的问题。

最后更新于