Dynamic Proxy模式初体验

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模式初体验,

 

                                         20061031

                                                  无锡

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值