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的APO与CGlib的AOP:

1、JDK的APO的proxy需要依赖与接口,而CGLib的APO不需要依赖接口;

2、JDK的APO生成实例速度快,但是执行效率慢,CGLib刚好相反,是生成实例慢,执行效率快;

3、CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
   因为是继承,所以该类或方法最好不要声明成final 

动态代理的本质:

       用来实现对目标对象进行增强,最终表现为类,只不过是动态创建子类,不用手工生成子类。

动态代理的限制:

       只能在父类方法被调用之前或之后进行增强(功能的修改),不能在中间进行修改,要想在方法调用中增强,需要ASM(一个Java 字节码操作和分析框架)


你可能感兴趣的:(动态代理,cglib,java动态代理)