Java的CGLib动态代理

来源:互联网 发布:中控iface702软件下载 编辑:程序博客网 时间:2024/04/27 13:49


CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并顺势织入横切逻辑。

public class BookFacadeImpl {      public void addBook() {          System.out.println("增加图书方法。。。");      }  }  
import java.lang.reflect.Method;  import net.sf.cglib.proxy.Enhancer;  import net.sf.cglib.proxy.MethodInterceptor;  import net.sf.cglib.proxy.MethodProxy;    /**  * 使用cglib动态代理  */  public class BookFacadeCglib implements MethodInterceptor {      private Object target;        /**      * 创建代理对象      * @param target      * @return      */      public Object getInstance(Object target) {          this.target = target;          Enhancer enhancer = new Enhancer();          enhancer.setSuperclass(this.target.getClass());  // 设置需要创建子类的类         // 回调方法          enhancer.setCallback(this);          // 通过字节码技术动态创建子类实例          return enhancer.create();      }        @Override      // 回调方法 ,拦截所有的父类方法调用     public Object intercept(Object obj, Method method, Object[] args,              MethodProxy proxy) throws Throwable {          System.out.println("事物开始");          Object result = proxy.invokeSuper(obj, args);   // 通过代码类调用父类中的方法        System.out.println("事物结束");          return result;      }    }  
 BookFacadeCglib cglib=new BookFacadeCglib();          BookFacadeImpl bookCglib=(BookFacadeImpl)cglib.getInstance(new BookFacadeImpl());          bookCglib.addBook();  

最终运行的结果如下:

事物开始增加图书方法。。。事物结束

注意加入cglib和asm的jar包,如不加asm包会报出如下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type


CGGlib创建的代理对象要比JDK的性能高很多,但是创建时所花费的时间却比JDK动态代理要多。所以对于singleton的代理对象或者具有实例池的代码,由于无须频繁创建代码对象,用CGLib比较合适。

也就是生命周期长的实例用CGLib比较合适。





0 0