网上看了一些关于动态代理的资料和写得好的博文,然后,为了加深印象 ,自己也比猫画虎的理解一下。

java的动态代理呢,是相对于静态代理 来说的,是为了解决 接口中多方法 所造成的 维护起来困扰 的产物。

主要实现呢,是由InvocationHandler 接口和Proxy代理 类 来完成地。

代码结构呢 ,是这样子地,接口ImplUserDao +接口实现类UserDaoImpl +代理类UserDaoProxy+测试类Client。

   测试类中创建代理对象 implUserDao2 ,由代理 对象implUserDao2  通过  代理人 InvocationHandler 中的handler来找到代理类UserDaoProxy,通过 invoke()方法来实现动态代理 。 基本上呢 ,就是有事的人implUserDao2  找到 中介平台InvocationHandler中的负责人handler来调用invoke(),间接完成地。

1 public interface ImplUserDao {
2     public void print();//定义接口打印方法
3 }
ImplUserDao接口
 1 public class UserDaoImpl implements ImplUserDao{
 2 
 3     /* (non-Javadoc)
 4      * @see cn.fupin.dao.ImplUserDao#print()
 5      */
 6     public void print() {
 7         System.out.println("UserDaoImpl.print()我被打印出来了……");
 8         
 9     }
10 
11 }
UserDaoImpl 实现类
 1 public class UserDaoProxy implements InvocationHandler{
 2 
 3     private ImplUserDao implUserDao;//定义  要代理的真实对象
 4     
 5     //创建构造方法 ,为调用代理类时传参
 6     public UserDaoProxy(ImplUserDao implUserDao) {
 7         
 8         this.implUserDao = implUserDao;
 9     }
10 
11     
12     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
13         //在 代理 对象  调用 真实对象时, 自动 关联 到invocationHandler 对象 来实现 动态代理 。
14         method.invoke(implUserDao, args);
15         return null;
16     }
17 
18 }
UserDaoProxy代理类
 1 public class Client {
 2     public static void main(String[] args) {
 3         //代理 的真实对象 
 4         ImplUserDao implUserDao = new UserDaoImpl();
 5         //创建代理 接口对象 。  没有这个handler对象,就没有 找人的感觉,何谈代理 
 6         //代理 的主要接口InvocationHandler ,在创建代理对象 的时候,会自动的关联到handler 对象来调用 代理类中的invoke()方法来实现代理 。
 7         InvocationHandler handler = new UserDaoProxy(implUserDao);
 8         
 9         //创建代理 对象 
10         ImplUserDao implUserDao2 =(ImplUserDao) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
11                 implUserDao.getClass().getInterfaces(),
12                 handler);
13         
14         implUserDao2.print();
15     }
16 }
Client测试类

invoke()方法解析

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

//当代理对象 调用 真实对象的方法时,会自动的跳转到代理对象关联的 handler对象的invoke方法来进行调用
method.invoke(subject, args);
return null;
}

参数proxy,定义的是我们要代理的那个真实对象

参数method,定义的是我们要调用真实对象的某些方法

参数args,定义的是调用真实对象某个方法时接受的参数

 

 

方法解析:

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

参数 loader,一个classLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载

参数interfaces,一个interface对象的数组,表示的是将要给需要代理的对象提供一组什么接口,如果我提供了一组接口给字,那么这个代理对象就宣称实现了该接口,这样我就能调用这组接口中的方法了。

参数h ,invocationHandler对象,在代理对象调用真实对象的时候,需要关联 调用invoke()方法的对象。

 

//代理 的主要接口InvocationHandler ,在创建代理对象 的时候,会自动的关联到handler 对象来调用 代理类中的invoke()方法来实现代理 。
InvocationHandler handler = new UserDaoProxy(implUserDao);

//创建代理 对象
ImplUserDao implUserDao2 =(ImplUserDao) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
implUserDao.getClass().getInterfaces(),
handler);

引用来自:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html

 

posted on 2015-01-27 16:02  风流书生  阅读(147)  评论(0编辑  收藏  举报