A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© LiuKang 中级黑马   /  2013-12-10 16:36  /  2710 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

动态代理的具体实现,两种具体实现的实例怎么写?

3 个回复

倒序浏览
1.Class clazzProxy = Proxy.getProxyClass(接口.class.getClassLoader(), 接口.class);
两个参数,一个加载器,一个接口的.class类
2.Class clazzProxy = Proxy.newProxyInstance(classLoader, interfaces,handler)
三个参数,一个类加载器,一个接口的数组(Class[]),一个handler

好像是这两个吧,好久没用,块忘了
回复 使用道具 举报
本帖最后由 gdzrch 于 2013-12-12 22:46 编辑

动态代理有两种
1.JDK实现
BookFacade.java


  1.     package net.battier.dao;  
  2.       
  3.     public interface BookFacade {  
  4.         public void addBook();  
  5.     }  
复制代码

BookFacadeImpl.java

  1.     package net.battier.dao.impl;  
  2.       
  3.     import net.battier.dao.BookFacade;  
  4.       
  5.     public class BookFacadeImpl implements BookFacade {  
  6.       
  7.         @Override  
  8.         public void addBook() {  
  9.             System.out.println("增加图书方法。。。");  
  10.         }  
  11.       
  12.     }  
  13.       
  14.     、BookFacadeProxy.java  
  15.       
  16.     package net.battier.proxy;  
  17.       
  18.     import java.lang.reflect.InvocationHandler;  
  19.     import java.lang.reflect.Method;  
  20.     import java.lang.reflect.Proxy;  
  21.       
  22.     /**
  23.      * JDK动态代理代理类
  24.      *  
  25.      * @author student
  26.      *  
  27.      */  
  28.     public class BookFacadeProxy implements InvocationHandler {  
  29.         private Object target;  
  30.         /**
  31.          * 绑定委托对象并返回一个代理类
  32.          * @param target
  33.          * @return
  34.          */  
  35.         public Object bind(Object target) {  
  36.             this.target = target;  
  37.             //取得代理对象  
  38.             return Proxy.newProxyInstance(target.getClass().getClassLoader(),  
  39.                     target.getClass().getInterfaces(), this);   //要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)  
  40.         }  
  41.       
  42.         @Override  
  43.         /**
  44.          * 调用方法
  45.          */  
  46.         public Object invoke(Object proxy, Method method, Object[] args)  
  47.                 throws Throwable {  
  48.             Object result=null;  
  49.             System.out.println("事物开始");  
  50.             //执行方法  
  51.             result=method.invoke(target, args);  
  52.             System.out.println("事物结束");  
  53.             return result;  
  54.         }  
  55.       
  56.     }  
复制代码

TestProxy.java

  1.     package net.battier.test;  
  2.       
  3.     import net.battier.dao.BookFacade;  
  4.     import net.battier.dao.impl.BookFacadeImpl;  
  5.     import net.battier.proxy.BookFacadeProxy;  
  6.       
  7.     public class TestProxy {  
  8.       
  9.         public static void main(String[] args) {  
  10.             BookFacadeProxy proxy = new BookFacadeProxy();  
  11.             BookFacade bookProxy = (BookFacade) proxy.bind(new BookFacadeImpl());  
  12.             bookProxy.addBook();  
  13.         }  
  14.       
  15.     }  
复制代码

但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。
2.Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
BookFacadeCglib.java
  1. package net.battier.dao;  
  2.   
  3. public interface BookFacade {  
  4.     public void addBook();  
  5. }
复制代码
BookCadeImpl1.java

  1.     package net.battier.dao.impl;  
  2.       
  3.     /**
  4.      * 这个是没有实现接口的实现类
  5.      *  
  6.      * @author student
  7.      *  
  8.      */  
  9.     public class BookFacadeImpl1 {  
  10.         public void addBook() {  
  11.             System.out.println("增加图书的普通方法...");  
  12.         }  
  13.     }  
复制代码
BookFacadeProxy.java

  1.     package net.battier.proxy;  
  2.       
  3.     import java.lang.reflect.Method;  
  4.       
  5.     import net.sf.cglib.proxy.Enhancer;  
  6.     import net.sf.cglib.proxy.MethodInterceptor;  
  7.     import net.sf.cglib.proxy.MethodProxy;  
  8.       
  9.     /**
  10.      * 使用cglib动态代理
  11.      *  
  12.      * @author student
  13.      *  
  14.      */  
  15.     public class BookFacadeCglib implements MethodInterceptor {  
  16.         private Object target;  
  17.       
  18.         /**
  19.          * 创建代理对象
  20.          *  
  21.          * @param target
  22.          * @return
  23.          */  
  24.         public Object getInstance(Object target) {  
  25.             this.target = target;  
  26.             Enhancer enhancer = new Enhancer();  
  27.             enhancer.setSuperclass(this.target.getClass());  
  28.             // 回调方法  
  29.             enhancer.setCallback(this);  
  30.             // 创建代理对象  
  31.             return enhancer.create();  
  32.         }  
  33.       
  34.         @Override  
  35.         // 回调方法  
  36.         public Object intercept(Object obj, Method method, Object[] args,  
  37.                 MethodProxy proxy) throws Throwable {  
  38.             System.out.println("事物开始");  
  39.             proxy.invokeSuper(obj, args);  
  40.             System.out.println("事物结束");  
  41.             return null;  
  42.       
  43.       
  44.         }  
  45.       
  46.     }  
复制代码

TestCglib.java

  1.     package net.battier.test;  
  2.       
  3.     import net.battier.dao.impl.BookFacadeImpl1;  
  4.     import net.battier.proxy.BookFacadeCglib;  
  5.       
  6.     public class TestCglib {  
  7.          
  8.         public static void main(String[] args) {  
  9.             BookFacadeCglib cglib=new BookFacadeCglib();  
  10.             BookFacadeImpl1 bookCglib=(BookFacadeImpl1)cglib.getInstance(new BookFacadeImpl1());  
  11.             bookCglib.addBook();  
  12.         }  
  13.     }  
复制代码




回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马