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();

    }

}





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