猪八戒娶媳妇之动态代理机制
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);?? }
}