cglib动态代理

Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类。使用CGLIB即使被代理类没有实现任何接口也可以实现动态代理功能。CGLIB具有简单易用,它的运行速度要远远快于JDK的Proxy动态代理:

使用CGLIB需要导入以下两个jar文件:

    asm.jar– CGLIB的底层实现。

    cglib.jar– CGLIB的核心jar包。

CGLIB的核心类:

    net.sf.cglib.proxy.Enhancer– 主要的增强类

net.sf.cglib.proxy.MethodInterceptor – 主要的方法拦截类,它是Callback接口的子接口,需要用户实现

net.sf.cglib.proxy.MethodProxy – JDK的java.lang.reflect.Method类的代理类,可以方便的实现对源对象方法的调用,如使用:

    Objecto = methodProxy.invokeSuper(proxy, args);//虽然第一个参数是被代理对象,也不会出现死循环的问题。



比较:



package czb.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;

import net.sf.cglib.proxy.MethodInterceptor;

import net.sf.cglib.proxy.MethodProxy;

publicclassCglibDemo {

    publicstatic void main(String[] args) {

        //1.声明被代理的类

         Object obj = new Person();//可以不写这个

        // 2.声明cglib的增强类

        Enhanceren = newEnhancer();

        // 3.设置被代理的类

        //en.setSuperclass(obj.getClass());

        en.setSuperclass(Person.class);

        // 4.设置回调,拦截方法

        en.setCallback(new MethodInterceptor() {

            @Override

            public Object intercept(Objectproxy, Method method, Object[] args,

                   MethodProxymproxy)throwsThrowable {

                System.err.println("拦截到了方法:"+method.getName());

                //method.invoke(obj, args);//此方法被代理的类必须要final

                ObjectreturnValue =  mproxy.invokeSuper(proxy,args);

                return returnValue;

            }

        });

        //获取代理类,此类是原类的增强

        Personp = (Person) en.create();

        System.err.println(p.getClass()+"///"+obj.getClass());

        p.say();

        p.run();

    }

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章