锁定老帖子 主题:猪八戒娶媳妇之动态代理机制
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-31
JAVA通过在java.lang.reflect库中提供的Proxy,InvocationHandler和Method这三个类来支持代理模式,当系统有了一个代理对象后,对原有对象的方法调用,会首先被分派给一个调用处理器(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); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 1430 次