CGLIB实现动态代理

CGLIB 介绍

CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库。

CGLib 可以在运行时扩展Java类与实现Java接口。CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口实现类的方法,还可以接管普通类的方法.

CGLib 的底层是Java字节码操作框架 —— ASM。

 

CGLIB实现动态代理

                     cglib 组织架构图

 

cglib是针对类来实现代理的,原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 

 

代理模式 

代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 

按照代理的创建时期,代理类可以分为两种。 

静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 

动态代理:在程序运行时,运用反射机制动态创建而成。 

 

Code Demo:

代理类:

public class CglibProxy implements MethodInterceptor {

    /**
     * 根据class对象创建该对象的代理对象
     * 1、设置父类;2、设置回调
     * 本质:动态创建了一个class对象的子类
     */
    public <T> T getProxy(Class<T> cls) {
        return (T) Enhancer.create(cls, this);
    }

    //  回调方法
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        before();
        Object result = proxy.invokeSuper(obj, args);
        after();
        return result;
    }

    private void after() {
        System.out.println("after proc");
    }

    private void before() {
        System.out.println("before proc");
    }

}

 

Enhancer的create方法:

    public static Object create(Class type, Callback callback) {
        Enhancer e = new Enhancer();
        e.setSuperclass(type);
        e.setCallback(callback);
        return e.create();
    }

通过create方法可知,cglib通过把要代理的类作为父类,生成其子类来动态生成代理类。 

 

普通Java类(没实现任何接口)

public class Lion{
    public void run() {
        System.out.println("草原之王——狮子在跑");
    }
}

 

测试类

public class AppTest {

    @Test
    public void testCglib() {
        CglibProxy cglibProxy = new CglibProxy();
        Lion lionProxy = cglibProxy.getProxy(Lion.class);

        lionProxy.run();
    }

}

 

 

你可能感兴趣的:(cglib)