Java代理模式3 - cglib动态代理实现

来源:互联网 发布:网络教育心理学 编辑:程序博客网 时间:2024/06/06 09:08

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

1、BookFacadeCglib.java

package net.battier.dao;  public interface BookFacade {      public void addBook();  }  

2、BookCadeImpl1.java

package net.battier.dao.impl;  /**  * 这个是没有实现接口的实现类  *   * @author student  *   */  public class BookFacadeImpl1 {      public void addBook() {          System.out.println("增加图书的普通方法...");      }  }  

3、BookFacadeProxy.java

package net.battier.proxy;  import java.lang.reflect.Method;  import net.sf.cglib.proxy.Enhancer;  import net.sf.cglib.proxy.MethodInterceptor;  import net.sf.cglib.proxy.MethodProxy;  /**  * 使用cglib动态代理  *   * @author student  *   */  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("事物开始");          proxy.invokeSuper(obj, args);          System.out.println("事物结束");          return null;      }  }  

4、TestCglib.java

package net.battier.test;  import net.battier.dao.impl.BookFacadeImpl1;  import net.battier.proxy.BookFacadeCglib;  public class TestCglib {      public static void main(String[] args) {          BookFacadeCglib cglib=new BookFacadeCglib();          BookFacadeImpl1 bookCglib=(BookFacadeImpl1)cglib.getInstance(new BookFacadeImpl1());          bookCglib.addBook();      }  }  
0 0
原创粉丝点击