`
suhuanxi
  • 浏览: 40775 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

猪八戒娶媳妇之动态代理机制

阅读更多

JAVA通过在java.lang.reflect库中提供的Proxy,InvocationHandlerMethod这三个类来支持代理模式,当系统有了一个代理对象后,对原有对象的方法调用,会首先被分派给一个调用处理器(InvocationHandler).程序可以在调用处理器的invoke()方法中截获这个调用,进行额外的操作.下面是我写的一个小例子.

package daili;

 

//高小姐的抽象接口,JAVA的动态代理机制要求被代理的类都应该有一个接口

public interface MissGaoInterface {

int age=18;

String address="高老庄";

public void whoIsMe();

}

//高小姐的真实本人,在本例即是被代理类

public class MissGao implements MissGaoInterface {

   public void whoIsMe() {

   System.out.println("我是高老庄的高小姐,今年"+age+"");

   }

 

}

//下面是代理类,齐天大圣变做高小姐的模样代替高小姐等待猪八戒的到来

public class QiTianDaSheng implements InvocationHandler {

private Object delegate;

private String who;

public Object bind(Object delegate){//指定一个要代理的类,这里是高小姐

   this.delegate=delegate;

   Class cls=delegate.getClass();

   return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), this);//生成代理对象,这个代理对象是实现了高小姐的接口的

}

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

          throws Throwable {

      if(who.equals("ZhuBaJie")){//如果来访的是猪八戒

      System.out.println("我是齐天大圣!");

      return null;

      }

      else  //如果来访的是其它人

          return method.invoke(delegate, args);    

   }

   public String getWho() {

      return who;

   }

   public void setWho(String who) {

      this.who = who;

   }

 

}

//生成高小姐的工厂,实际上是经过代理的对象

public class Factory {

public static MissGaoInterface getInstense(String who){

   QiTianDaSheng q=new QiTianDaSheng();

   q.setWho(who);

   MissGaoInterface o=(MissGaoInterface)q.bind(new MissGao());

   return o;

}

}

//猪八戒的类,也就是要访问高小姐的客户端

public class ZhuBaJie {

public void kiss(MissGaoInterface miss){

   miss.whoIsMe();

}

}

//测试

public class Test {

   public static void main(String args[]){  

      ZhuBaJie z=new ZhuBaJie();

//获取高小姐的对象时,传入参数,告诉高小姐我是谁

      MissGaoInterface m=Factory.getInstense("ZhuBaJie");

//猪八戒访问高小姐,输出是我是齐天大圣”,猪八戒并不知道高小姐经过代理,猪八戒上当了,哈哈!如果是其它人访问,就会允许见到真正的高小姐.

      z.kiss(m);   }

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics