Java的代理机制通俗地去解释

       今天了解了Java的代理机制,不过看了半天书,还是不太懂。
自己的理解是:这个应该是系统级开发采用到的东西,目的在于程序运行时动态确定具体是哪类对象。代理处理器需要实现InvocaitonHandler的invoke接口。实际类的对象的方法调用时,都会调用这个invoke()方法。Proxy.newProxyInstance(,,)方法可以获得实际的对象。
大概就清除这么多了。


         转贴一篇文章 http://dev.csdn.net/author/CMTobby/d2674b7941c44a0098de42f4af10092c.html

前几天一个网友指出了我的文章中一些有失偏颇之处,那些文章都是我在阅读JavaCore的时候做的总结,顺便加上我个人的一些理解。因为看的e文版,理解上有些地方可能还欠妥。下面谈一下对Java中代理模式(Proxy)的认识。

代理,想必大家都应该知道是什么冬冬了,一般的手机产商都有代理商,歌星们都有自己的经纪人,如此这些都可以看作是一种代理模式。下面我选择如下的一种情景来进行讲述:某董事长出差,但是此时公司有个聚会,董事长买单,但是由他的秘书去结帐。我们就权且把这个看作一个代理行为,^_^

首先我们定义一个接口:商人(Merchant),如下所示:

package cn.edu.hust.cm.test;

public interface Merchant{

    voidtreat();//商人都要请客吃饭滴,^_^

}

然后我们定义一个类:董事长(Director),如下所示:

package cn.edu.hust.cm.test;

public class Director implements Merchant{

      public Director() {

      }

      public void treat() {

             System.out.println("董事长请大家吃饭");

      }

}

OK,我们现在要给他找代理了,这个代理就是他的秘书(Secretary)。这里要涉及到一些代理的机制了。在Java中,用来做代理的类一般都要实现InvocationHandler,实现它的invoke方法,至于为啥是这样俺也不知道了,^_^。另外,当我们产生一个代理实例(proxyinstance)的时候,只要我们通过这个实例调用任何方法,都会导致invoke方法的调用,还是看例子吧,如下所示:

package cn.edu.hust.cm.test;

 

importjava.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

 

public class Secretary implements InvocationHandler{

      public Secretary(Director director){

             this.director=director;

      }

      public Object invoke(Object arg0, Method arg1, Object[]arg2)

                    throws Throwable {

       director.treat();

             System.out.println("由秘书结帐咯!");

             return null;

      }

      private Director director;

}

现在我们开始构建我们的主体测试代码,如下面的代码所示:

package cn.edu.hust.cm.test;

 

importjava.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

 

public class ProxyTest extends Proxy{

 

      public ProxyTest(InvocationHandler arg0){

             super(arg0);

      }

      public static void main(String[] args){

             Director director=new Director();

             InvocationHandler secretary=newSecretary(director);

             Merchantmerchant=(Merchant)Proxy.newProxyInstance(director.getClass().getClassLoader(),director.getClass().getInterfaces(),secretary);

             merchant.treat();

      }

 

}

运行程序,输出将为:董事长请客

   由秘书结帐咯!

这里有几个要说明的地方,如下所述:

1Proxy.newProxyInstance方法的作用,它的作用为某个对象创建一个代理对象,本例中是为director创建了一个代理对象,这个对象属于哪个类呢?我们在程序里面加这样一句System.out.println(merchant.getClass().getName()),输出是$Proxy0,呵呵,说明已经产生了一个代理类了,这个类实现了director所属类中的所有接口。

2.代理的实现机制问题。个人觉得这个似乎就是一个事件处理的机制,当代理对象调用某个方法的时候,就会触发相应的invoke方法。因此Proxy.newProxyInstance方法的第三个参数就相当于给这个代理对象注册了一个监听器。

Proxy类还有几个方法,用法可以查看相应的API文档。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值