Dynamic Proxy模式初体验
今天早上看了《深入浅出Hibernate》,在书的第35页部分谈到了,Dynamic Proxy模式(动态代理模式)重没接触过,就稍微的研究了一下,并且自己做了一个小的例子,现在介绍给大家
要实现动态代理共分为两个步骤:
第一,将动态代理绑定到指定的对象(注意在下面的程序中将会看到,绑定的方法是绑定到获得对象句柄的接口上,必须要这样做)
第二 设置方法调用拦截器。Invoke.
下面进入实例讲解。
写将一下例子要实现的功能,现定义一个BOY接口,里面有fuck()和love()方法,让和定义一个类 Jack 实现 BOY 接口,再定义一个又一个类 X,其中有一个say()方法,say()方法将会输出一条语句“you can’t fuck”,本程序的目标是在主程里面实现当这样,
Boy jack =new Jack();
在Jack.fuck();时
输出:”you can’t fuck”(fuck()中没有“you can’t fuck”这条输出语句了)
如何实现了,这就需要使用Dynamic Proxy模式给出程序并加以说明:
1. Boy.java
public interface Boy {
public void fuck();
public void love();
}
2. Jack.java
public class Jack implements Boy{//这里必须用接口的方法予以实现,不然的话将无法绑定动态代理
public void fuck()
{
System.out.println("fuck");
}
public void love()
{
System.out.println("I Love you");
}
}
3 X.java
public class X {
public void say()//这是将会在方法拦截器替换掉fuck()方法。
{
System.out.println("you can't fuck");
}
}
4.T.java Dynamic Proxy模式的实现部分
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
import java.lang.Throwable;
/*要实现 Dynamic Proxy模式的类必须要实现java.lang.reflect.InvocationHandler
这个接口并实现其中的
public Object invoke(Object proxy,Method method,Object []args) throws Throwable这个“方法凋用拦截器”
*/
public class T implements InvocationHandler{
public X x;
public Boy f2;
/*
将动态代理绑定到指定的Boy上面
@param f
@return 绑定后的Boy
*/
public Boy bind(Boy f)
{
x = new X();
f2 = f;
Boy f =(Boy)Proxy.newProxyInstance(f.getClass().getClassLoader(), f.getClass().getInterfaces(), this);// 将动态代理绑定到指定的Boy上面,注意//只能绑定道接口上面去,
return f1;// return 绑定后的Boy
}
/*方法调用拦截器
判断当前调用的方法是否是”fuck”方法
如果是,将调用x.say()方法来代替
*/
public Object invoke(Object proxy,Method method,Object []args) throws Throwable
{
Object object =null;
if("fuck".equals(method.getName()))//判断当前调用的方法是否
//是”fuck”方法
{
x.say();//如果是,将调用x.say()方法来代替
}
else
{
object = method.invoke(f2, args); //如果不是,就调用自身中的它方法
}
return object;
}
}
5.test.java 主函数入口
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Boy f3 = new Jack();
T t = new T();
f3 = t.bind(f3);
f3.fuck();
f3.love();
}
}
结果显示:
完成了Dynamic Proxy模式初体验,
2006.10.31
无锡