Java動態代理--CGLib動態代理

package com.mzsx.gclib;
public class FunctionServerImp  {
    public void creatdDoc(int count) {
        System.out.println("建立了"+count+"對象。。。。。。。");
    }
    public void removeDoc(int count) {
        System.out.println("***了"+count+"對象。。。。。。。");
    }
}



package com.mzsx.gclib;
public class Porformant {
    private long start;
    private long end;
    public  void start(){
        System.out.println("執行start。。。。。");
        start =System.currentTimeMillis();
    }
               
    public void end(){
        end=System.currentTimeMillis();
        System.out.println("耗時"+(end-start)+"ms........");
    }
}


package com.mzsx.gclib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CGlibProxy implements MethodInterceptor {
    private Enhancer enhancer=new Enhancer();
    public Object getProxy(Class clazz){
              
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }
          
    @Override
    public Object intercept(Object obj, Method method, Object[] arg,
            MethodProxy proxy) throws Throwable {
        Porformant porformant=new Porformant();
        porformant.start();
              
        Object object=proxy.invokeSuper(obj, arg);
        porformant.end();
              
        return object;
    }
          
}



package com.mzsx.gclib;
public class CGlibTest {
    public static void main(String[] args) {
        CGlibProxy cGlibProxy=new CGlibProxy();
        FunctionServerImp functionServerImp=(FunctionServerImp)cGlibProxy.getProxy(FunctionServerImp.class);
        functionServerImp.creatdDoc(10);
        functionServerImp.removeDoc(20);
    }
      
}


對比JDK的AOP與CGlib的AOP:java

一、JDK的AOP的proxy須要依賴與接口,而CGLib的APO不須要依賴接口;框架

二、JDK的AOP生成實例速度快,可是執行效率慢,CGLib恰好相反,是生成實例慢,執行效率快;ide

三、CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法
   由於是繼承,因此該類或方法最好不要聲明成final this

動態代理的本質:spa

       用來實現對目標對象進行加強,最終表現爲類,只不過是動態建立子類,不用手工生成子類。代理

動態代理的限制:orm

       只能在父類方法被調用以前或以後進行加強(功能的修改),不能在中間進行修改,要想在方法調用中加強,須要ASM(一個Java 字節碼操做和分析框架)對象

相關文章
相關標籤/搜索