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 字节码操做和分析框架)对象

相关文章
相关标签/搜索