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 字節碼操做和分析框架)對象